JP3539914B2 - マイクロコンピュータ - Google Patents

マイクロコンピュータ Download PDF

Info

Publication number
JP3539914B2
JP3539914B2 JP2000212452A JP2000212452A JP3539914B2 JP 3539914 B2 JP3539914 B2 JP 3539914B2 JP 2000212452 A JP2000212452 A JP 2000212452A JP 2000212452 A JP2000212452 A JP 2000212452A JP 3539914 B2 JP3539914 B2 JP 3539914B2
Authority
JP
Japan
Prior art keywords
instruction
bit
register
bits
dividend
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
JP2000212452A
Other languages
English (en)
Other versions
JP2001067219A (ja
Inventor
俊平 河崎
康宏 田原
馨 深田
尊永 山崎
栄二 榊原
桂一 倉員
泰 赤尾
志朗 馬場
利昌 木原
有吾 柏木
秀哉 藤田
克彦 石田
典子 澤
陽一 浅野
英明 茶木
正彦 菅原
正博 海永
孝樹 野口
満 渡部
卓 塚元
茂樹 増村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Renesas Technology Corp
Hitachi Solutions Technology Ltd
Original Assignee
Renesas Technology Corp
Hitachi ULSI Systems Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Renesas Technology Corp, Hitachi ULSI Systems Co Ltd filed Critical Renesas Technology Corp
Priority to JP2000212452A priority Critical patent/JP3539914B2/ja
Publication of JP2001067219A publication Critical patent/JP2001067219A/ja
Application granted granted Critical
Publication of JP3539914B2 publication Critical patent/JP3539914B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Description

【0001】
【産業上の利用分野】
本発明は、符号付き除算等に適用されるマイクロコンピュータ、特にRISC(Reduced Instruction Set Computer:縮小命令セット型コンピュータ)系マイクロコンピュータ、例えば機器に組み込まれてこれを制御するマイクロコンピュータのアーキテクチャに関する。
更に本明細書では、符号付き除算のための回路、例えば、任意長多精度の符号付き2進数の除算回路、特にRISC系マイクロコンピュータによるステップ除算を開示する。
【0002】
【従来の技術】
マイクロコンピュータ等で行われる除算の技術として、被除数の符号と除数の符号とから商と剰余の符号を決定し、被除数の絶対値との除算を回復法や被回復法などで実行し、最後に商と剰余との符号補正を行う除算方式が公知である。近年、符号付き除算に於いて、被除数および除数の絶対値をとらず、符号付きの状態で除算を実行する回路および方式が幾つか公開されている。被除数と除数とを符号付きの状態で除算を行う場合、いずれの方式でも、基本的には、次の手順を採用している。すなわち、被除数あるいは部分剰余の符号と除数の符号とが等しい場合は被除数あるいは部分剰余から除数を減算した結果を新たな部分剰余とし、被除数あるいは部分剰余の符号と除数の符号とが異なる場合は被除数あるいは部分剰余に除数を加算した結果を新たな部分剰余とするようにして、その減算又は加算を順次繰返して商を求めていく。このとき、被除数が正の場合または被除数が除数で割り切れない場合はこの手順に基づき、若干の商または剰余補正を実行することにより、正しい答えを得ることができる。しかし、被除数が負で且つ被除数が除数で割り切れる場合、これによって求められる商は、正しい商よりも絶対値の小さい方へLSBの重みを持つ”1”だけ小さくなる。この誤りは、負の被除数あるいは部分剰余に対して上記加算又は減算を行って部分剰余が0となった場合にこの部分剰余の符号を正しいとみなしてしまうことにより生じる。
【0003】
この誤りを解決するために、部分剰余が0になったことを検出し、商を補正する手段を備えた除算回路が幾つか考案されている。例えば、特開平2−165326号には、非回復型の除算手段に、各行での演算結果(部分剰余のこと)が0のときにセットされ、被除数の各行での最下位ビットに1が入ってきたときにリセットされるレジスタを持ち、このレジスタの結果を用いて、商および余の補正を行う技術が記載されている。これによれば、上記のセットおよびリセットされるレジスタを用いて部分剰余が0になった場合を検出し補正することにより正しい符号付き除算を実現している。また、特開平2−171828号には、部分剰余が0であるかどうかを商ビットを決定するステップ毎に検出することにより、被除数が負の場合に、誤った商ビットが出力されるのを防止する技術が記載されている。さらに特開昭59−160235には、被除数が負であって除算の途中で部分剰余が0になったら、その最上位ビットを1と考えるようにするために、部分剰余が0になつた場合を検出するハードウエアを設けた技術が記載されている。
【0004】
【発明が解決しようとする課題】
上述のように、被除数と除数を符号付きの状態で除算する従来の技術は、部分剰余が0になったことを検出して商ビットの補正を行っている。斯る技術では、部分剰余を求める度にそれが0であるかを判定しなければならない。除数がnビットであればその様な判定動作をn回行うことが必要になり、除算処理全体の動作ステップ数を増大させる。更に部分剰余が0か否かはその全ビットを見なければならず、1回の判定処理を高速化しようとすれば専用ハードウェアも必要になることが予想される。
【0005】
更に本発明者は除算等に利用されるマイクロコンピュータ等についても検討した。それによれば、1命令を実行するのに必要なマシンサイクル数を低減する際の一番の隘路は命令のデコード処理であることが知られている。デコード処理を高速化するためには、命令の境界がどこに存在するかを前の命令の解釈が済む前にわかるように、固定長の命令フォーマットを採用することが効果的であるということが知られている。いわゆるRISC系コンピュータでは、固定長の命令フォーマットと多段のパイプラインを採用することで殆どの命令を1サイクルで実行している。これまでのRISC系コンピュータでは例外無く32ビット命令フォーマットを使用してきた。32ビット固定長命令フォーマットの長所は、ソースレジスタとデスティネーションレジスタの命令フォーマット中のフィールドを固定してしまう事により、オペコード(オペレーションコード)部分のデコードをしなくとも、どのレジスタを読めばよいかを決められる点と、イミディエート値をデコードする際にアライメントの調整が不要な点である。その反面32ビット固定長命令フォーマットでは、どんなに処理内容の単純な命令を記述する場合にも32ビットを要するので、1連の処理を機械語で書いた場合に命令コードの占有バイト数が大きくなってしまい、プログラム全体がメモリ領域に占める割合が増える点が問題であった。プログラムのメモリ占有領域が増えると、より容量の大きなメモリを実装することを余儀なくされるため、マイクロコンピュータシステムのコストが上がり、コスト性能比の良いシステムを構成する事が困難になる。特にRISCプロセッサは命令数を少なくすることにより命令の実行を高速化しようとするアーキテクチャであるため、命令セットに対して未定義オペレーションコードが比較的多くなるという傾向を持つ。未定義オペレーションコードが多いということは、オブジェクトプログラムのコード効率を悪化させ、即ちメモリの利用効率を一層低下させる。
【0006】
斯るメモリの利用効率もしくはコード効率向上という点についての先の出願として、特願平2−222203号がある。この出願内容は命令フォーマットをデータ語長よりも短いビット数とするものである。しかしながらその場合には、データ語長よりも短いビット数の固定長命令フォーマットを採用することに付随して種々の問題点を解決しなければならないことが本発明者によって見出された。例えば、データ語長に匹敵するビット数のイミディエートデータを必要とする場合の方策、さらには肥大化するプログラムやシステム構成に対して分岐先アドレスのような絶対アドレスの指定の仕方などの、データ処理上において新たな方策の検討が必要である。また、前記先願は、データ語長と命令語長とに2のべき乗の関係を持たせることについては一切考慮されていない。このことにより、メモリの1ワード境界を越えて1命令が存在するようなミスアライメントを積極的に防止するには至らず、メモリの利用効率さらにはソフトウェアプログラムの簡素化並びに処理速度という点においても新たに検討すべき事柄が残されている。
【0007】
本発明の目的は、データ語長よりも少ないビット数の固定長命令フォーマットを採用することに付随する問題点を解決することにある。
本発明の目的は、被除数が負の場合にも商ビットを求める除算のステップ毎に部分剰余が0であるか否かの検出を行うことなく簡単に正しい商を求めることができる除算回路、そして除算方法を提供することにある。
本発明の別の目的は、被除数が正であるのか負であるのかを考慮することなく除算プログラムの開発を可能にする除算回路を提供することにある。
本発明のその他の目的は、回路構成が簡単で、しかも除算効率を向上させることができる除算回路を提供することにある。
【0008】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【0009】
【課題を解決するための手段】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【0010】
(1)符号付き除算において、被除数が負である場合にその被除数から該被除数のLSBの重みを持つ”1”を引く操作を除算の前処理として行う。被除数のLSBの重みが1であればその被除数は整数である。被除数が固定小数点数の場合にはこれを整数と見なして除算の処理を行っても実質的な影響はない。後から小数点位置の桁合せを行えば済むからである。したがって、被除数のLSBの重みを1と見なすことによって被除数を整数と見なして途中の演算を行っても実害はなく、以下の説明において特にことわらない限り被除数を整数と見なすものとする。
(2)被除数が負のときの符号ビットは1で、正または0のときの符号ビットが0であることに着目すると、被除数からその符号ビット(被除数のMSB)を差引けば、負の被除数から1を引いたことになる。これは、2の補数表現の負の整数から1の補数表現への変換とみなすことができる。このようにすれば、被除数が正か負かを考慮しなくても被除数に対する前処理を行うことができる。図35には例えば、4ビットの負の整数から1を引いた変換状態が示される。有限ビット数の2の補数の最小値を1の補数に変換するには1ビット余分に必要であるので、必要な場合は1ビット拡張する。また、部分剰余は正になることもあるので、負の整数に対して行った上記の変換を整数全体に拡張し、新しい整数の表現を導入する。例えば、4ビット符号付き整数の範囲では図36に示されるような表現が採用される。尚、任意の整数をその数から1を引いた数で表現したものをZZとすると、2の補数を用いた整数に対し1を引く変換を行ったZZの表現は0以下の整数では1の補数と同一視でき、0以上の整数では本来の値より1だけ小さい数で表現される。このとき、0の符号ビットは負の数と同じ1となる。
(3)符号付き除算の過程において、商と部分剰余(若しくは余り)の保持という点において、演算され或は演算に供されるべき商ビットや部分剰余をレジスタ等に転送するための処理ステップ数を少なくするには、商(商ビット)と余り(部分剰余)とを1本のレジスタのような単一の記憶手段に保持させるようにするとよい。
【0011】
上記した符号付き除算のための手段によれば、被除数が負の場合に被除数から被除数のLSBの重みを持つ1を引く前補が行われ、次いで商の符号が予測され、更に被除数または部分剰余の符号と除数の符号との排他的論理和が0か1かに基づいて、被除数または部分剰余に除数が加減算され、部分剰余の符号と除数の符号との排他的論理和を商ビットとし、且つ商が負の場合に1の補数の商を2の補数に補正し、このようにして商が求められる。
上記被除数が負の場合、被除数のLSBの重みを持つ1を該被除数から引くことは、0の表現を全てのビットに1が立ち符号ビットも1であるような表現にする前処理と等価とされる。このような前処理は、被除数が負の場合に部分剰余が0になったことを検出しなくても済むようにする。その結果、最初の被除数の符号ビットと、部分剰余の符号ビットと、除数の符号ビットと、商の符号ビットとの情報に基づいて、オーバーフローチェックや剰余の補正を含めた除算の制御が可能になる。このことが、除算のハードウェア並びにソフトウェアを単純化し、更に、任意長任意精度の符号付き除算への適用も可能にし、その上、部分剰余を格納するレジスタを1ビット上位にシフトすると同時に商ビットをシフトインする手段を適用した処理の高速化にも対応可能とする。
【0012】
こここで、上記除算回路等が適用されるマイクロコンピュータ又はCPUのアーキテクチャに関して言及する。
(1)汎用レジスタ方式を採用するマイクロコンピュータにおいて、命令実行手段に供給される最大のデータ語長よりもビット数の少ない固定長命令フォーマットを採用することができる。
(2)前記固定長命令フォーマットに設定されるビット数がメモリ上におけるプログラムのミスアライメントの防止に役立つようにするには、前記固定長命令フォーマット及び前記最大データ語長はそれぞれ2のべき乗のビット数を設定するとよい。例えば最大データ語長が32ビットのとき命令フォーマットは16ビットに固定する。
上記によれば、例えば32ビットのデータ語長に対して16ビット固定長命令フォーマットを採用することは、命令フォーマットが固定長であるという点において従来の32ビット固定長命令フォーマットを持つRISCマシンと同様に命令境界がどこに存在するかの判定を前の命令が完了する前に把握することができて命令デコード処理の単純化などの利点を保証するように作用する。
また、32ビット固定長命令フォーマットを採用する場合に比べてプログラム容量が小さくなる。即ち、命令の種類を少なくすることにより命令の実行を高速化しようとするRISCアーキテクチャにおいては命令セットの中に未定義オペレーションコードが多くなる傾向があり、このとき命令長が従来とは半減すればプログラムメモリの利用効率が向上する。
【0013】
(3)データの最大語長と命令フォーマットのビット数との間に前記関係がある場合、前記最大データ語長に等しいビット数の内部バスを利用して能率的に命令をフェッチするには、若しくは命令フェッチのためのバスアクセス回数を減らすには、バス幅全体を使って複数命令を同一サイクルでプリフェッチするようにすればよい。
(4)内部バスがデータ転送と命令フェッチに共用される場合に、データフェッチと命令フェッチが競合したときの処理若しくはそれに起因する後処理を簡単化するには、データフェッチを優先し、このデータフェッチに競合する命令フェッチを含む命令実行スケジュールを全体的に遅延させるパイプ制御を行うようにするとよい。
(5)汎用レジスタ方式を採る性質上、パイプライン的に実行される前後の命令による前記汎用レジスタの利用が競合する状態に簡単に対処するには、パイプライン的に実行される複数の命令による前記汎用レジスタの利用が競合する状態を命令フォーマット中に含まれるレジスタ指定領域の情報に基づいて検出し、検出されたレジスタ競合状態とレジスタ競合状態にある相対的に先に実行される命令の実行サイクル数とに基づいてレジスタ競合状態の相対的に後の命令の実行を遅延させるようにパイプ制御を行えばよい。
(6)固定長命令フォーマットのビット数の制限がイミディエートデータの利用に制限を与えないようにするには、特定のレジスタの値に対してディスプレースメントの値をオフセットとするレジスタ相対でイミディエートデータを指定させる記述を含む命令をサポートするとよい。
(7)ビット数が制限された固定長命令フォーマットであっても、データ処理上必要なディスプレースメント若しくはイミディエートデータのビット数を極力多くする方策とし、命令中にレジスタ指定フィールドがないのにも拘らずオペランドとして固定された特定の汎用レジスタを暗黙的に指定させる命令をサポートするとよい。
(8)同様に、ビット数が制限された固定長命令フォーマットであっても、処理上必要なディスプレースメント若しくはイミディエートデータのビット数を極力多くする方策とし、指定条件に対する演算結果の真偽を所定の状態フラグに反映させる記述を含む命令をサポートするとよい。
(9)分岐命令の種類に応じて適切な分岐先指定用ディスプレースメント長を固定的に割り当てる。16ビット固定長命令フォーマットのとき、条件分岐命令のディスプレースメントを8ビットに固定し、サブルーチン分岐命令及び無条件分岐命令のディスプレースメントを12ビットに固定する。
【0014】
上記マイクロコンピュータ若しくはCPUのアーキテクチャによれば、固定長命令フォーマットのビット数がデータ語長より少なくても、イミディエートデータの利用や絶対アドレス指定に制限を及ぼさないこと、限られたビット数の固定長命令フォーマットの中で必要なディスプレースメントなどの記述が可能であること、メモリ上におけるプログラム配置のミスアライメントの防止に寄与すること、並びにサポートする命令の内容という点からコード効率もしくはメモリ利用効率を一層向上させることなど、データ語長よりも少ないビット数の固定長命令フォーマットを採用することに付随する各種問題点の解決を実現する。
【0015】
【発明の実施の形態】
先ず、最大のデータ語長よりもビット数の少ない固定長命令フォーマットを採用したマイクロコンピュータについて、項目〔1〕〜〔17〕に従って説明する。その後で、マイクロコンピュータ等によって処理される本発明に係る符号付き除算を項目〔18〕〜〔24〕の順に説明する。
【0016】
〔1〕マイクロコンピュータの応用システム
【0017】
図1には本発明の一実施例に係るマイクロコンピュータMCUを利用したシステムの一例が示される。マイクロコンピュータMCUは、外部コントロールバスECB、外部データバスEDB、及び外部アドレスバスEABを介して、外部メモリEMRYとユーザが定義する外部入出力装置EI/Oに結合され、また、ポート入出力バスPIOBを介して外部装置EEQに接続される。外部装置EEQはマイクロコンピュータシステムが組み込まれる所定の機器である。
【0018】
〔2〕マイクロコンピュータのブロック構成
【0019】
図2には本発明の一実施例に係るマイクロコンピュータMCUが示される。同図に示されるマイクロコンピュータMCUは、公知の半導体集積回路製造技術によってシリコン基板のような1個の半導体基板に形成される。図においてCPUはマイクロコンピュータMCU全体の制御を司る中央処理装置である。Port/I/Oは入出力ポートであり、外部に対してCPUが信号を入出力したり、外部の表示機器をドライブしたり、外部のスイッチの状態を調べたりするのに使用される。CPUはあるアドレスに割り当てられたレジスタを読み書きすることで入出力を行う。Port/Contはバス制御線の出入口とされるポートである。Port/Dataはデータバスの出入口とされるポートである。Port/Addressはアドレスバスの出入口とされるポートである。I/OはマイクロコンピュータMCUのオンチップ上の周辺機器である。SCIはシリアル通信用インタフェースであり、TIMERはタイマであり、DMACはダイレクト・メモリ・アクセス(DMA)コントローラである。ROMはオンチップで実装された読出し専用メモリ(リード・オンリ・メモリ)であり、CPUの動作プログラムや定数テーブルなどを保有する。RAMはオンチップで実装されたランダムアクセスメモリであり、中央処理装置CPUの作業領域やデータの一次記憶領域などとして利用される。BSCはバスステートコントローラであり、マイクロコンピュータMCUの内部及び外部に対するバスアクセス制御を行う。CACHEはキャッシュメモリであり、中央処理装置CPUによる命令のアクセスパタンを認識して最も頻繁に使用されることが予想される命令を保持して、アクセス速度の遅い外部メモリからアプリケーションプログラム等を読みにいくアクセス回数を減らして処理の高速化を図るための記憶装置である。BURST/REFRESHは連続データ転送などに対するバースト制御やダイナミック・ランダム・アクセス・メモリ(DRAM)などに対するリフレッシュ制御を行うバースト/リフレッシュ装置であり、DRAMを外付けメモリとして使用する際の高速ページモードアクセスとDRAMのリフレッシュなどに適用される。EDBは外部データバス、EABは外部アドレスバス、IDB31−0は32ビットの内部データバス、IAB23−0は24ビットの内部アドレスバスである。
【0020】
〔3〕マイクロコンピュータのパッケージのピン配置
【0021】
図3には前記マイクロコンピュータMCUのパッケージのピン配置が概念的に示される。同図においてフリーランニングタイマFRT0,FRT1、アナログ・ディジタル変換器A/D、及びシリアル通信用インタフェースSCI0,SCI1は図2の周辺機器I/Oの一例とされ、これに対応して図3に示されるポートPORT1乃至PORT4は夫々の周辺機器に対応する入出力ポートであって図2のポートPort/I/Oに対応される。マイクロコンピュータMCUは、特に制限されないが、112ピンのQFP型のパッケージに封入されている。24ビットのアドレスバス(A0−23)は前記アドレスバスEABに接続し、32ビットのデータバス(D0−31)は前記データバスEDBに接続する。これらバスA0−23,D0−31は、中央処理装置CPU、ダイレクト・メモリ・アクセス・コントローラDMAC、又はバースト/リフレッシュ制御装置BURST/REFRESHが外部メモリEMRYをアクセスするときに使用される。クロック関連信号は中央処理装置CPU内部と外部のシステムとが同期して動作する際の時間の基本タイミングを規定するクロックの関連信号である。例えば端子EXTALと端子XTALの両端に図示しない水晶振動子を結合すると、マイクロコンピュータMCUのチップ内部の電気回路と共鳴して発振する。当該チップはこの発振電圧を拾うことにより、後で説明する内部同期用クロックφ1、φ2を生成する。これらのクロックφ1,φ2は、特に制限されないが、ハイ期間が互いに重なることがないノンオーバラップクロック信号とされる。同時に外部のシステムとLSI内部の同期をとるために、φ1と殆ど同じ波形と位相を持った外部クロックCLKを出力する。制御関連信号は、リセット信号(RES)スタンバイ信号(STBY)などの動作モード設定用の信号、割り込み入力用の信号、リードストローブ(RD)やライトストローブ(WRHH、etc)などのデータバスの制御信号、DRAMリフレッシュ制御、バスアービトレーション用の信号などを含む。Vss,Vccはグランド端子,電源端子である。ポートPORT1からはダイレクト・メモリ・アクセス・コントローラDMACに関する制御信号が2チャンネル分入出力される。ポートPORT2にはフリーランニングタイマFRT0,FRT1に対する外部からの制御と読出しをするための信号がある。ポートPORT3はアナログ・ディジタル変換器A/Dの関連信号として外部からのアナログ信号を入力する。アナログ・ディジタル変換器A/Dのレファレンス電位は端子AVcc,AVssから与えられる。ポートPORT4はシリアル通信インタフェース用の信号を入出力し、それら信号はクロック用、データ送信用、データ受信用の3系統とされ、2チャンネル分ある。
【0022】
〔4〕命令語長とデータ語長
【0023】
図4には本実施例のマイクロコンピュータMCUにおけるバス幅(バスの並列ビット数)に対するデータ語長と命令語長との一例関係が示される。本実施例のマイクロコンピュータMCUは、RISC型のアーキテクチャを有し、固定長の命令フォーマットを有する。データや命令が転送されるバス例えば内部データバスID31−0は32ビットとされる。このとき後述する各種レジスタのビット数は32ビットである。メモリ上のデータもバイト(8ビット)、ワード(16ビット)、ロングワード(32ビット)を単位として、32ビットの幅を有するメモリ領域に配置されている。メモリにはバイト単位で番地が割り当てられる。したがって、バイトデータはn番地(nは整数)、ワードデータは2n番地、ロングワードデータは4n番地単位でアクセスされる。これ以外のメモリアクセスはアドレスエラーとされる。一方、命令は16ビット固定長命令フォーマットとされる。
【0024】
前記16ビット固定長命令フォーマットの数例を示す図4において、rrrrの4ビットはソースレジスタ指定フィールド、RRRRの4ビットはデスティネーションレジスタの指定フィールド、d…ddはディスプレースメント、ii…iはイミディエートデータを意味する。16ビットの命令フォーマットにおいて、デスティネーションレジスタ指定フィールドRRRRは当該フォーマット左側を基準に第4ビット目から第8ビット目とされ、ソースレジスタ指定フィールドrrrrは第9ビット目から第12ビット目とされる。命令フォーマットの左側4ビットは少なくともオペレーションコード指定フィールドとされる。マイクロコンピュータMCUの命令体系においては、デスティネーションレジスタ指定フィールドRRRRをオペレーションコード指定フィールドの一部として利用し、また、ソースレジスタ指定フィールドrrrrをディスプレースメント又はイミディエートデータの一部として利用することを許容する。
【0025】
32ビットのデータ語長に対して16ビット固定長命令フォーマットを採用することにより、命令フォーマットが固定長であるという点において従来の32ビット固定長命令フォーマットを持つRISCマシンと同様に命令境界がどこに存在するかの判定を前の命令が完了する前に把握することができて命令デコード処理の単純化などの利点を保証する事ができる。その上、32ビット固定長命令フォーマットを採用する場合に比べてプログラム容量を小さくすることができる。即ち、命令の種類を少なくすることにより命令の実行を高速化しようとするRISCアーキテクチャにおいては命令セットの中に未定義オペレーションコードが多くなる傾向があり、このとき命令長が従来とは半減すればプログラムメモリの利用効率が向上する。また、データ語長に比べて命令語長を短くすることは、双方の語長が等しくされる場合に比べて、固定長命令フォーマットのビット列において実質的に無駄なビット配列を減少させ、これが、プログラムメモリの利用効率を高くする。したがって、プログラムを格納するためのメモリの利用効率が向上し、実装ボード上の限られた記憶容量のメモリやプロセッサにオンチップされたプログラムメモリを用いる応用分野などでは、システム構成時にプログラムメモリの記憶容量が不足したり、メモリの回路規模を大きくせざるを得ないというような問題点の発生を回避して、システムコストを低減することができる。
【0026】
更に、16ビット固定長命令フォーマットは32ビットのデータ語長並びにバス幅のちょうど半分であるから、命令語長をバス幅やデータ語長に対して半端なビット数(例えば2のべき乗以外のビット数)に設定して命令語長を短くする場合に比べて、メモリのバウンダリー境界(ワード境界)を越えて単一フォーマットの命令が配置されるというようなプログラムメモリに対する命令のミスアライメントを生じ難い。
【0027】
〔5〕CPUの命令制御系
【0028】
図5には前記中央処理装置CPUの内部ブロック、特にその命令制御系の一例が示される。IRHとIRLはそれぞれ16ビットの命令バッファ(命令キュー)であり、命令を1つずつ格納する。これらのレジスタIRH,IRLには1回の命令フェッチサイクルで夫々に命令がロードされる。命令は内部データバスIDB31ー0を介して32ビット単位で転送されてくるからである。これらはマルチプレクサMPXを介して命令レジスタIR1にロードされる。命令レジスタIR1は16ビットである。この命令レジスタIR1は命令デコード段に存在する命令を保持する。命令レジスタIR1中では、16ビット固定長命令フォーマットにしたがってRRRRとして示される左端を基準に第5ビット目乃至第7ビット目がデスティネーションレジスタフィールド、rrrrとして示されている第8ビット目乃至第12ビット目がソースレジスタフィールドとされる。これらのフィールドは命令フィールドの中で固定されている。このとき、前述のようにソースレジスタフィールドは必ずソースオペランドを指定するのに使用され、デスティネーションレジスタフィールドは2つ目のソースオペランド又はデスティネーションオペランドを指定するのに使用される。各レジスタフィールドの意味はオペレーションコードの一部になる場合とレジスタの番号になる場合とがある。レジスタ指定フィールドRRRR及びrrrrの内容がレジスタを指定する情報であるか否かは前記固定長命令フォーマットの左端基準で第1ビット目乃至第4ビット目のオペレーションコードの内容によって決定される。これに拘らずレジスタフィールドRRRR、rrrrの値は、インストラクションレジスタIR2を介してソースレジスタデコーダSRDとデスティネーションレジスタデコーダDRDに入力されてデコードされる。
【0029】
前記ソースレジスタデコーダSRDとデスティネーションレジスタデコーダDRDとによるデコード結果は、実行部EXECに含まれる汎用レジスタR0H,R0L,…,R15H,R15Lの中からどれを選択するかの指定に利用される。また、前記インストラクションレジスタIR2から出力されるレジスタフィールドRRRR、rrrrの値は、一時ラッチWBR0及びWBR1を介してライトバックレジスタデコーダWBRDに供給され、そのデコード結果は、命令実行によって得られる演算結果などをライトバックすべき汎用レジスタの指定に利用される。さらに前記一時ラッチWBR1に格納されたレジスタ番号すなわちレジスタフィールドRRRR、rrrrの値はレジスタコンテントチェック(Register Content Check)ブロックRCCBに供給され、インストラクションレジスタIR1、IR2の出力と比較され、次々にフェッチされた命令がパイプライン的に実行されるときに夫々の命令が同一のレジスタをアクセスする事象(レジスタの競合)を割出す。レジスタ競合状態は信号S1によってフラグ操作及びパイプ制御デコーダFO&PCDに供給される。アサート状態の信号S1がフラグ操作及びパイプ制御デコーダFO&PCDに供給されると、現在実行中の命令実行サイクル数に応じてスキップ(Skip)制御が行われ、競合状態のレジスタを利用する命令の実行サイクルをキャンセル若しくは遅延させる。これにより、先の命令の実行によって競合レジスタの書き込みが完了される後のタイミングを以て後続する命令の実行サイクルが開始される。
【0030】
前記インストラクションレジスタIR1が保持する命令はマッピングコントロール(Mapping Control)ブロックMCBに供給され、これにより高速制御リードオンリメモリ(Hardware Sequence ROM)HSCーROMのアドレスが割出される。マッピングコントロールブロックMCBの役割は、命令をデコードしてその内容に応じて適切な高速制御リードオンリメモリMHSC−ROMのエントリアドレスを算出することである。高速制御リードオンリメモリHSC−ROMの出力はマイクロ命令フィールド(Micro Code Field)MCFとパイプ制御フィールド(Pupe Contorl)PCFの2つの部分から成り、マイクロインストラクションレジスタのようなハードウェア・シーケンス・コントロール・インストラクション・レジスタHIRにラッチされる。マイクロ命令フィールドにおける前者は浅いデコード論理即ちインストラクションデコーダIDを介して実行ユニットEXECに制御信号を供給する。後者はフラッグ操作およびパイプ制御デコーダFO&PCDを介して2サイクル以上のシーケンスを持つ命令のシーケンスを生成したり、パイプラインの制御を行う。フラッグ操作およびパイプ制御デコーダFO&PCDは8つのフラッグC、W、B、L、M、I、S、Sを持っており、これによりパイプラインの制御を行う。更に、このフラグ操作及びパイプ制御デコーダFO&PCDはステータスレジスタSRを有し、同レジスタSRは、条件分岐などに利用されるトゥルービットT(以下Tビットとも記す)を有する。このTビットは、後で説明するように命令に記述されている指定条件に対する演算結果の真偽が設定される。
【0031】
前記インストラクションレジスタIR1の内容は演算実行フェーズ(EX)の前にインストラクションレジスタIR2に移され、後のメモリアクセスフェーズ(MA)とライトバックフェーズ(WB)のパイプラインステートにある命令との間でコンフリクトを起こさないかが前記レジスタコンテントチェックブロックRCCBを介してチェックされ、その結果が信号S1として出力される。この時、インストラクションレジスタIR2に格納されるのはレジスタフィールドの値のみである。前述のようにインストラクションレジスタIR1、IR2が保持するレジスタフィールドRRRR,rrrrの値は前記ソースレジスタデコーダSRD、デスティネーションレジスタデコーダDRD、ライトバックレジスタデコーダWBRDに供給される。ソースレジスタデコーダSRD、デスティネーションレジスタデコーダDRD、ライトバックレジスタデコーダWBRDは、16本の汎用レジスタR0H,R0L、…、R15H,R15Lの内の1つのレジスタペアを選択する選択信号を生成して、実行ユニットEXECに供給する。
【0032】
メモリインタフェースMIFは中央処理装置CPUがメモリをアクセスする必要があるか無いか、それがリードかライトかなどを検出してメモリのアクセスに必要な信号を出する。また命令フェッチ/命令レジスタ制御(Instruction Fetch&IR Control)ブロックIF&IRCはメモリからの命令フェッチが必要か否か、インストラクションレジスタIR0,IR1をいつアップデートするかなどを決定して必要な信号を出力する機能を有する。この命令フェッチ/命令レジスタ制御ブロックIF&IRCの機能はパイプラインの状態、メモリのウエイト状態、命令キュー(IRH,IRL)の状態などを参考に、命令キューや命令フェッチの制御を行う。本実施例で特徴的なのは命令フェッチが32ビット単位で行われるのでその中には16ビットの命令長の命令が2つ詰まるということである。このため、前回の命令をフェッチするときに同時にフェッチした命令は別フェーズで改めてフェッチする必要がない。この様な事象を総合して命令フェッチをいつ行うかが制御される。命令フェッチ/命令レジスタ制御ブロックIF&IRCは有限状態ステートマシンとして構成され、その構成については公知であるため詳細な説明を省略する。
【0033】
尚、図5においてIMBは命令に含まれるイミディエートデータなどを実行ユニットEXECに送るためのバッファである。また、命令キューIRH,IRL、インストラクションレジスタIR1のラッチタイミングは前記クロック信号φ1に同期される。インストラクションレジスタIR2、マイクロインストラクションレジスタMIR、及びレジスタWBR0,WBR1のラッチタイミング、並びに前記レジスタコンテントチェックブロックRCCBによる信号S1出力タイミングは前記クロック信号φ2に同期される。
【0034】
〔6〕CPUの実行ユニット
【0035】
図6及び図7には中央処理装置CPUの実行ユニットEXECの一例が示される。双方の図面において夫々A,B,C,Dで示されるバスは共通接続されている。実行ユニットEXECは、特に制限されないが、命令のフェッチやプログラムカウンタの更新をする命令フェッチ部IFB、汎用レジスタ部GRB、加減算シフト演算などを行う演算部OPB、メモリのアクセスおよびデータのアライメント処理をするメモリアクセス部MAB、及び乗算部MULTを含む。前記夫々のブロックは4本の32ビット幅のデータバスA,B,C,Dにより結合されている。
【0036】
前記命令フェッチ部IFBの一部である前記命令バッファ(命令キュー)IRH,IRLは図5のブロック構成では実行ユニットEXECとは別に記載さているが、実際には図6のように配置されている。イミディエートバッファ(Immediate Buffur)IMBは即値データ(イミディエートデータ)を切り出して必要ならビットシフトを行うための論理である。PCH,PCLは、命令フェッチを行うためのアドレスを格納しておくプログラムカウンタである。AUH(Arithmetic Unit High)、AUL(Arithmetic Unit Low)はプログラムカウンタの更新をするための加算器であり32ビットの加算をすることができる。PRH(Procedure Address Register Higf),PRL(Procedure Address Register Low)は関数コールをするときに戻りアドレスを格納するためのプロシージャアドレスレジスタである。VBRH(Vector Base Register High),VBRL(VectorBase Register Low)は、割り込みベクタ領域のベースアドレスの格納領域として使用される。GBRH(Global Base Register Low)は、I/Oのベースアドレスの格納レジスタとして利用される。BRH(Break Register High),BRL(Break Register Low)は、ブレークルーチンからの戻り先アドレスの格納レジスタとして利用される。
【0037】
前記汎用レジスタ部GRBにはR0H,R0L〜R15H,R15Lで示される32ビット長の汎用レジスタが16本含まれる。前記演算部OPBにおいてSFTH(Shifter High),SHTL(Shifter Low)はビットシフトやローテートなどを行うためのハードウェアである。ALUH(Arithmetic Logic Unit High),ALUL(Arithmetic Logic Unit Low)は算術論理演算を行う演算器である。SWP&EXTは、スワップ命令を実行したり符号拡張(サイン拡張)やゼロ拡張を実行するためのハードウェアである。ALN(Aligner)は、バイトやワードでメモリやI/Oからアクセスされたデータをアライメントするためのハードウェアである。MRBH(Memory Read BufferHigh),MRBL(Memory Read Buffer Low)はメモリから読まれたデータを入れるためのテンポラリレジスタである。MWBH(Memory Write Buffer High),MWBL(Memory Write Buffer Low)はメモリに書込むデータを入れるためのテンポラリレジスタである。MABH(Memory Address Buffer High),MABL(Memory Address Buffer Low)はメモリアクセスの際のアドレスを入れておくテンポラリレジスタである。MLTB(MULT Buffer)は、乗算部MULTへ乗数と被乗数を転送するためのテンポラリレジスタである。
【0038】
中央処理装置CPU内外のバスとの接続関係は次の通りとされる。即ち、MTBL,MTBHは乗算部MULTと接続するための双方向専用バスである。図6及び図7においてIDBH,IDBLは図2のデータバスIDB31−0に対応され、また、IABH,IABLは図2のアドレスバスIAB23−0に対応される。前記プログラムカウンタPCH,PCLの値はアドレスバスIABH,IABLに出力され、命令バッファIRH,IRLはデータバスIDBH,IDBLからデータを受取り、テンポラリレジスタMWBH,MWBLの出力はデータバスIDBH,IDBLに与えられる。テンポラリレジスタMRBH,MRBLにはデーバスIDBH,IDBLおよび専用バスMTBH,MTBLからデータが入力可能にされる。テンポラリレジスタMABH,MABLが保持するアドレス情報はアドレスバスIABH,IABLに出力される。乗算用のテンポラリレジスタMLTBは専用バスMTBH,MTBLに出力される。
【0039】
〔7〕CPUによるパイプラインステージ
【0040】
図8には中央処理装置CPUによるパイプライン処理のステージの一例が示される。この中央処理装置CPUの基本的なパイプライン構成は5段ステージとされ、基本的なステージのフェーズは、
IF:(Instruction Fetch)命令フェッチ、
ID:(Instruction Decode)命令デコード、
EX:(Execute)実行、
MA:(Memory Access)メモリアクセス、
WB:(Write−Back)ライトバック、
とされる。各パイプステージの実行内容の一例を示す図8において、AddressBusは図2のアドレスバスIAB23−0に対応され、DataBusは同じくIDB31−0に対応される。図8のIRは図6及び図5の命令バッファIRH,IRLに対応される。図8において、A−Bus、B−Bus、C−Bus、D−Bus、は夫々図7におけるAバス、Bバス、Cバス、Dバスである。同様に図8におけるMAB、MRBは図7におけるMABH,MABL、MRBH,MRBLである。
【0041】
〔8〕レジスタ競合状態におけるパイプラインシーケンス
【0042】
図9を参照しながら前記レジスタ競合状態におけるパイプラインシーケンスを説明する。まず最初に同図に示される信号の意味を説明する。動作基準クロック信号としての前記ノンオーバラップ2相クロック信号φ1とφ2の波形が図9の一番上に示される。1つのマシンサイクルとはクロック信号φ1の立上りに始まり、次のφ1の立上りに終わる1周期である。続いてアドレスバスとデータバスの状態を示す。次のIRLatchは命令バッファ(IR(32bit)またはIRHとIRL)のラッチ信号を示している。IRLatchはIR1レジスタの入力ラッチ信号波形を示している。IR1(16bit)は命令デコード段に存在する命令を保持する。前記ハードウェア・シーケンス・コントロール・インストラクション・レジスタ(Hardware Sequence Control Instruction Register)HIRは、部分デコードされたマイクロコードとシーケンス情報やパイプラインのコントロール情報を保持するレジスタである。図9においてReg.Content FlagはLOAD命令と実行ユニットEXECを使用する命令との間でのレジスタの競合をチェックする必要があることを示すフラッグである。サイクル4でこれが検出されてContent Flag(Cフラッグ)がセットされる。同時にオペランドをロードする必要があることを示すLOAD Flag(Lフラッグ)がセットされる。また同様にしてバスオペレーションが必要になることを示すBus Cycle Flag(Bフラッグ)も4サイクル目でセットされる。このフラッグはバスサイクルが現在行われているかを示すフラッグである。命令フェッチ抑止フラッグ(IF Inhibit Flag:Iフラッグ)は命令フェッチを取りやめてその代わりにデータアクセスを行うことを示すフラッグである。スキップ信号(Skip Sig.)はそのサイクルに実行ユニットEXECで行われる処理をキャンセルする意味のフラッグである。Executionは実行ユニットEXECで行われる処理を示している。Reg.Writeはレジスタへの書込み信号である。通常演算時のReg.Writeにより、C−Busを介して、命令で指定されたデスティネーションレジスタへの書き込みが行われる。LOAD命令およびMULT命令実行時は、D−Busを介して、命令で指定されたデスティネーションレジスタへ書き込みが行われる。その意味でタイミングチャートには信号Reg.WriteをC−Bus用とD−Bus用に分かち書きしてあり、両信号Reg.Writeが同じレジスタに重なった場合にはC−Bus優先で書き込みが行われる。即ち、C−Busからの書き込みのみが実行される。5サイクル目に書かれている点線の山はSkip Sig.により抑止されたレジスタへの書き込みを示している。MABはメモリアドレスバスの意味であり、データアクセスが行われた際のアドレスを出力する。MRB Latchはメモリリードバッファの意味であり、データをラッチする信号である。PCはプログラムカウンタの値を示している。
【0043】
図9はLOAD命令(LOAD @R1,R2)とADD命令(ADD R2,R3)とのシーケンスを一例として示したタイミングチャートである。LOAD命令がデータを格納するレジスタR2とADD命令が使用するレジスタR2は共通であり、通常のパイプラインフローで命令実行が行われるとレジスタR2の値が決定される前に当該レジスタR2の値が演算に使用されるという事態を生じる。この例では斯るレジスタR2の使用が競合したときに、パイプラインの制御がどのようなタイミングで行われるかを7サイクルにわたって示している。最下段にパイプラインの実行状況を示す。LOAD命令のデスティネーションとなったレジスタR2とADD命令のソースレジスタR2が衝突するので、網掛けで表示した5サイクル目にストール(遅延)が生じている。この遅延を生じさせるには、先ず、レジスタ競合状態が生ずるか否かの検出と、レジスタ競合状態を回避するには実行サイクル(EX)を何サイクル遅延させればよいかの認識が必要になる。前者に関しては、前記レジスタWBR1が出力する先の命令に含まれるレジスタ指定情報(この例に従えばLOAD命令に含まれるレジスタR2を指定する情報)と、後の命令に含まれるレジスタ指定情報(この例に従えばADD命令に含まれるレジスタR2を指定する情報)とを比較する前記レジスタコンテントチェックブロックRCCBが出力する信号S1がアサートされることによって検出される。後者に関しては、オペレーションコードのデコード結果から認識することができる。図の例ではLOAD命令の実行サイクル(EX)数は1であるから、第5サイクル目だけに遅延が生じている。
【0044】
図10にはレジスタ競合状態におけるパイプラインシーケンスの別の例が示される。図10は乗算命令としてのMULT命令(MUL R1,R2)とADD命令(ADD R4,R3)とSUB命令(SUB R3,R2)とのシーケンスを例として示したタイミングチャートである。MUL命令がデータを格納するレジスタR2とSUB命令が使用するレジスタR2が共通である。レジスタ競合状態をパイプラインシーケンスに反映しなければ、命令実行が行われるとレジスタR2の値が決定される前に別の演算に使用されるという事態を生じる。本例ではこのようにレジスタの使用が競合したときに、パイプラインの制御がどのようなタイミングで行われるかを7サイクルにわたって示している。本図の表記形式は前記図9の場合と同様であり、詳細な説明は省略するが、乗算が4サイクルで実行できる様子を示す。MULT命令ではEX,ML,ML,MLの4ステージで命令実行を行う。乗算器は16b*16bの結果を32bに格納する乗算を4サイクルで実行することができる。これは16b*4bの部分積と累積和を求めることを各サイクルに行うことで実行できる。この例の場合には、MULT命令に対してSUB命令は2サイクル遅れてレジスタR1にフェッチされ、MULT命令はEX,ML,ML,MLの4サイクルで乗算演算を実行するから、SUB命令の実行サイクル(EX)が2サイクル分遅延されている。
【0045】
〔9〕メモリアクセス競合時のパイプラインシーケンス
【0046】
図11にはメモリからのデータフェッチと命令フェッチが競合した場合の一例パイプ制御シーケンスが示される。この場合にはデータフェッチが優先され、これに競合する命令フェッチを含む命令実行スケジュールは全体的にずらされる。この制御を行うために、ロード・フラグ(LOAD Flag)とバス・サイクル・フラグ(Bus Cycle Flag)とが競合する状態においてインストラクション・フェッチ・ウェイト・フラグ(IF Wait Flag)がセットされ、命令フェッチサイクルの開始が遅延される。
【0047】
〔10〕複数サイクル命令実行のシーケンス
【0048】
図12には複数サイクル命令を実行するときの一例タイミングチャートが示される。ここではAND(論理積)命令の一種である命令”AND.B #imm,@R1”を一例として説明する。この命令はレジスタR1相対で指定されるメモリの8ビットデータと8ビットイミディエートデータとの論理積を演算する命令である。このAND.B命令はマクロ命令1、マイクロ命令1、マイクロ命令2によって実行される複数サイクル命令とされる。前記マクロ命令1は、レジスタR1の内容により指定されるメモリの領域からバイトオペランドをフェッチする命令である。前記マイクロ命令1は、前記バイトオペランドにイミディエートデータをANDする命令である。前記マイクロ命令2は、レジスタR1の内容により指定されるメモリの領域にバイトオペランドをライトする命令である。
【0049】
前記AND.B命令の実行内容をC言語で記述すると、
Figure 0003539914
となる。この記載を参照すると、マイクロ命令1のID(命令デコード)段とEX(演算実行)段との間、およびマイクロ命令2のμ−IF(マイクロ命令フェッチ)段とID段との間に空きサイクルがある。これは、マクロ命令1のMA(メモリアクセス)段でフェッチしたオペランドをマイクロ命令1のEX(演算実行段)段で使用しなくてはならないからである。
【0050】
〔11〕CPUの命令割り付け
【0051】
中央処理装置CPUに割り付け可能とされる命令は、図13及び図14に示されるデータ転送命令、図15に示される論理演算命令、図16及び図17に示される算術演算命令、図18に示されるシフト命令、図19に示される分岐命令、図20及び図21に示されるシステム制御命令とされる。図22は図13乃至図21の記載形式を説明するものである。これに従えば、図13乃至図21の記載において、命令の項目はニモニックで表示される。このニモニック表示中におけるアドレシングモードの一覧は図23に示される。各種命令コードから明かなように、16ビット固定長命令フォーマットで表現できる65536通りの組み合わせだけで汎用レジスタ方式の整数演算、分岐方式、制御命令等が全て割付けられる。デコードもビットの割り付けを工夫して類似の機能の命令をグルーピングしたことによって、比較的少ない論理表現で実現できる。オペレーションコードが”1111”で始まる命令列は全てリザーブされており、これを使うことにより、IEEE浮動小数点規格に準拠した単精度、倍精度演算を割り付けることもできる。
【0052】
〔12〕ブランチ命令のディスプレースメント長
【0053】
図24、図25、図26、及び図27には、サンプルとして抽出した各種プログラムにおけるブランチ命令及びジャンプ命令のディスプレースメント長とそのディスプレースメント長を有する命令の出現頻度との関係が示される。図24及び図25は条件分岐命令(ブランチ命令)及び無条件分岐命令(ブランチオールウエイズ命令)に関し、図26はサブルーチン呼出命令に関し、図27はジャンプ命令若しくはジャンプサブルーチン命令に関する。ここでブランチとは計算機プログラムの実行において多数の選択し得る命令集合のうちの一つを選ぶことである。ジャンプとは計算機プログラムの実行における現に実行されている命令の暗示的又は指定されている実行順序からの脱出を意味する。ディスプレースメントは飛び先番地の指定に利用される。従ってディスプレースメント長のビット数が多いほど遠くのアドレスに飛ぶことができる。
【0054】
図24乃至図26に示される分岐命令に対するディスプレースメントの頻度分布は、株式会社日立製作所のマイクロコンピュータH8/500の各種プログラムを解析して得られたデータである。使用している分岐命令の各種類についての、ディスプレースメント値の分布を表している。横軸は使用されたディスプレースメント値のlog2をとった値であり、0を中心として右方向にはディスプレースメントの値が正の場合を正の整数(1,3,5,7,・・・)でlog2{displacement}を表し、左方向には、負の値を持つディスプレースメントについて負の数で−log2{−displacement}を表す。縦軸は%を単位としてその出現頻度を示す。データは9個の異なるプログラムについて採集した。
【0055】
図24及び図25から明かなようにブランチ命令及びブランチオールウエイズ命令において、出現頻度の高いものは比較的中心より分布しており、8ビットのディスプレースメントがあれば分布のほとんどをカバーできる。また、図26のサブルーチン呼出命令では、かなり遠くまでとんでいるが、12〜13ビットのディスプレースメントフィールドがあれば全てカバーできることがわかる。さらに図27に示されるジャンプ命令若しくはジャンプサブルーチン命令の場合、横軸の値はジャンプ命令が存在した番地とジャンプ飛び先の番地の差をディスプレースメントとした。これもとび先が遠いことが判る。
【0056】
本実施例のマイクロコンピュータMCUにおいては、条件分岐命令のディスプレースメントを8ビット、サブルーチン分岐命令及び無条件分岐命令のディスプレースメントを12ビットに固定して、それら命令を16ビット固定長命令フォーマットに収めるようにしてある。例えば図19に示される各種分岐命令において、BC,BT,BFの夫々が条件分岐命令とされ、同図におけるBSRがサブルーチン分岐命令、そしてBRAが無条件分岐命令とされる。夫々の命令の詳細な内容については後述する命令の説明の項目を参照されたい。
【0057】
プログラムを比較的小さなサブルーチン(関数)の集合として作成するモジュラープログラミング手法において、条件分岐命令は関数の中にしか飛ばない。多くの関数は数百バイト程度の大きさしかないため8ビットのディスプレースメントでほとんどカバーすることができる。反面サブルーチン分岐は関数自身の外に飛ぶので近い場所には飛ばない傾向があり、条件分岐命令よりも多くのビット数のディスプレースメントを必要とする。無条件分岐は、プログラムの高速化のために関数の最後で別の関数を呼ぶときに使用される場合もあり、プログラム作成時にサブルーチン分岐命令と同一の扱い方をすることが得策と考えられるため、ディスプレースメントのビット数はサブルーチン分岐と同一にしてある。このように分岐命令の種類に応じて適切なディスプレースメント長を固定的に割り当てることにより、実質的な弊害なく、16ビット固定長命令フォーマットの実現に寄与する。
【0058】
〔13〕イミディエートデータの処理
【0059】
16ビット固定長命令フォーマットを採用したとき、データ語長が32ビットであることに鑑みれば全てのイミディエート値(即値)を16ビット以下に制限することは現実的ではない。本実施例では16ビット以上のイミディエート値の指定を一つの命令フォーマット中で行えるようにするために、プログラムカウンタPCなどのレジスタの値と相対アドレスを使用する手法を採用する。
【0060】
この即値処理を行う命令としては例えば図13に示されるロード命令としてのMOV.W@(disp,PC)RnやMOV.L@(disp,PC)Rnなどがある。これらの命令は、汎用レジスタRnにイミディエートデータを格納するための命令である。データは32ビットに符号拡張される。データがワード/ロングワードのときは、プログラムカウンタPCにディスプレースメントを加えたアドレスに格納されたテーブル内のデータを参照する。データがワードのとき、ディスプレースメントは1ビット左シフトされ9ビットとされ、テーブルとの相対距離は−256から+254バイトになる。プログラムカウンタPCは本命令の2命令後の先頭アドレスである。従って、ワード・データは2バイト境界に配置する必要が有る。データがロングワードのとき、ディスプレースメントは2ビット左シフトされ10ビットとされ、オペランドとの相対距離は−512から+508バイトになる。プログラムカウンタPCは本命令の2命令後の先頭アドレスであるが、プログラムカウンタPCの下位2ビットはB,00に補正される。従って、ロングワード・データは4バイト境界に配置する必要がある。
【0061】
〔14〕暗黙のレジスタ指定
【0062】
暗黙のレジスタ指定とは、命令中にレジスタ指定フィールドがないのにも拘らず、オペランドとして固定された汎用レジスタを選ぶことを言う。ここで言う汎用レジスタは、例えばメモリアドレスを決定するために利用され、或いはメモリからフェッチしたデータの格納に利用される。この暗黙のレジスタ指定を行う命令としては、例えば図14に従えば、MOV @(disp,R1),R0やMOV R0,@(disp,R1)を挙げることができる。同図の当該命令に対応するコードからも明らかなように、レジスタ指定フィールドはなく、オペレーションコードと8ビットのディスプレースメントddddddddを含むだけである。このディスプレースメントは暗黙に指定されているレジスタR1の値と共にメモリアドレスを決定するために利用される。この暗黙のレジスタ指定によって、レジスタの値とディスプレースメントとを必要とする命令において、ディスプレースメントとして必要とされるビット数を減らさなくても、命令語長を16ビットに収めることが可能になる。
【0063】
〔15〕機能複合命令
【0064】
機能複合命令として例えば図15に記載のAND.B #imm,@R1のようなビット操作命令を挙げることができる。この命令は前記同様の暗黙に指定されるレジスタR1相対で指定されるメモリの8ビットデータと8ビットのイミディエートデータとの論理積(AND処理)を行う命令であり、メモリのリード、AND処理、AND処理結果の当該メモリへの書き込み戻しを行う、3命令を複合した命令である。この種の処理は組み込み機器制御用途においては極めて出現頻度が高く、このような複合機能的な命令を16ビット固定長命令フォーマットとして採用することはコード効率向上に寄与する。
【0065】
〔16〕指定条件に対する真偽設定命令
【0066】
指定条件に対して演算結果の真偽設定を行う命令として、例えば図16に示される8種類のCMP命令を挙げることができる。これら命令はオペランドの比較を行う命令であり、比較結果を前記ステータスレジスタSRのT(True)ビットに設定する。例えば、COMP/EQ Rm,RnFFで示される命令は、レジスタRmとRnの値が等しいか否かを比較し、等しいときはTビットに1セットし、不一致の時は0にクリアする。このようにステータスレジスタにTビットを設け、比較結果に対する真偽をTビットに設定する操作を16ビット固定長命令フォーマットの1命令で行うことにより、その結果の真偽に基づく処理を行うような次命令例えば前記条件分岐命令(BT命令)においては直接Tビットを参照すればよく、当該BT命令それ自体に前の命令による演算結果に対して必要な条件(Condition)の記述は不要となり、限られた固定長命令フォーマット中においてその分だけBT命令に必要なディスプレースメントの領域を大きく採ることが可能になり、結局において、16ビット固定長命令フォーマットの実現に寄与する。
【0067】
〔17〕命令一覧
【0068】
ここまでの説明において、16ビット固定長フォーマットの命令のうち特徴的な命令を代表的に説明してきたが、更に、16ビット固定長命令フォーマットの全貌を明らかにするため、本実施例のマイクロコンピュータの全ての命令をアルファベット順に逐次説明していく。夫々の命令の説明は、命令の名称、アセンブラの入力書式で表示された書式(imm、dispは数値、またはシンボル)、命令の説明、命令使用上の注意事項、C言語で表示された動作説明、アセンブラニモニックで例示された動作例(命令の実行前後の状態を表示)、及びコードを含む。ここで夫々の命令を説明する前に、プログラムを行う場合に着目すべきプログラマーズモデルとしてのレジスタ構成を図28を参照しながら説明する。プログラマーズモデルとされるレジスタは、前記汎用レジスタR0(R0H,R0L)乃至R15(R15H,R15L)の他に、ステータスレジスタSR、プロシージャ・レジスタPR(PRH,PRL)、グローバル・ベース・レジスタGBR(GBRH,GBRL)、プログラムカウンタPC(PCH,PCL)、ベクタ・ベース・レジスタVBR(VBRH,VBRL)、ブレーク・レジスタBR(BRH,BRL)などのコントロールレジスタとされる。図28の例ではレジスタR0はアキュムレータ、レジスタR1はインデックス・レジスタ、レジスタR15はスタックポインタとされる。図28のステータスレジスタSRにおいて、M/QビットはDIV命令で参照され、Iビットは割り込みマスクビットとされ、−は予約ビットとされ、DビットはPASS命令で参照され、Cビットはキャリ/ボロー/オーバーフロー/アンダーフロー/シフトアウトを反映するビットとされ、Tビットは前記したように真(1),偽(0)を表すビットとされる。
【0069】
Cで動作内容を示した動作説明は、特に制限されないが、以下の資源の使用を仮定している。
unsigned char Read_Byte(unsigned long Addr);
unsigned short Read_Word(unsigned long Addr);
unsigned long Read_Long(unsigned long Addr);
アドレスAddrのそれぞれのサイズの内容を返す。(2n)番地以外からのワード、(4n)番地以外からのロングワードのリードはアドレスエラーとして検出される。
unsigned char Write_Byte(unsigned long Addr, unsigned long Data);
unsigned short Write_Word(unsigned long Addr, unsigned long Data);
unsigned long Write_Long(unsigned long Addr, unsigned long Data);
アドレスAddrにデータDataをそれぞれのサイズで書き込む。(2n)番地以外からのワード、(4n)番地以外へのロングワードのライトはアドレスエラーとして検出される。
Delay_Slot(unsigned long Addr);
アドレス(Addr-4)のスロット命令に実行を移す。これはDelay_Slot(4)のとき、4番地ではなく0番地の命令に実行が移ることを意味する。また、この関数からBC,BF,BT,BRA,BSR,JMP,JSR,RTS,BRK,PASS,RTB,RTE,TRAPで特定される命令に実行が移されようとすると、その直前にスロット不当命令として検出される。
unsigned long R[16];
unsigned long CR[3];
unsigned long PC;
unsigned long BR;
unsigned long VBR;
各レジスタ本体である
#define SR (CR[0])
#define PR (CR[1])
#define GBR (CR[2])
レジスタの固有名とCRn形式表示の対応
Figure 0003539914
これ以外に、PCは現在実行中の命令の4バイト(2命令)先を示しているものと仮定する。これは、(PC=4;)は4番地ではなく0番地の命令に実行が移ることを意味する。
【0070】
アセンブラニモニックの形式で記載される使用例において、コードはバイナリコードを表示し、
ニモニック中 rは コードの rrrr、RはRRRR、immはiiiiiiiiに展開される。dispはdddd、dddddddd、又はddddddddddddに展開される。
MOV命令コード中の SS はオペランドサイズによって01=バイト、10=ワード、11=ロングワードに展開される。
【0071】
《ADD(加算)命令》
〔書式〕
ADD Rm,Rn
ADD #imm,Rn
〔説明〕
汎用レジスタRnの内容とRmとを加算し、結果をRnに格納する。
汎用レジスタRnと8ビット・イミディエート・データとの加算も可能である。8ビット・イミディエート・データは32ビットに符号拡張されるので減算と兼用する。
Figure 0003539914
〔コード〕
ADD r,R ;(MSB)0010RRRRrrrr0000(LSB)
ADD #imm,R;(MSB)0101RRRRiiiiiiii(LSB)
【0072】《ADDC(キャリ付き加算)命令》
〔書式〕
ADDC Rm,Rn
〔説明〕
汎用レジスタRnの内容とRmとCビットを加算し、結果をRnに格納する。演算の結果によりキャリがCビットに反映される。
Figure 0003539914
〔コード〕
ADDC r,R ;(MSB)0010RRRRrrrr0010(LSB)
【0073】
《ADDS(飽和機能付き加算)命令》
〔書式〕
ADDS Rm,Rn
〔説明〕汎用レジスタRnの内容とRmとを加算し、結果をRnに格納する。オーバーフローが発生しても、結果はH'7FFFFFFF〜H'80000000の範囲に制限される。このとき、Cビットがセットされる。
Figure 0003539914
〔コード〕
ADDS r,R;(MSB)0010RRRRrrrr0011(LSB)
【0074】
《ADDV(オーバーフロー付き加算)命令》
〔書式〕
ADDV Rm,Rn
〔説明〕
汎用レジスタRnの内容とRmとを加算し、結果をRnに格納する。オーバーフローが発生した場合、Cビットがセットされる。
Figure 0003539914
〔コード〕
ADDV r,R;(MSB)0010RRRRrrrr0001(LSB)
【0075】
AND(論理積)命令
〔書式〕
AND Rm,Rn
AND #imm,R0
AND.B #imm,@R1
〔説明〕
汎用レジスタRnの内容とRmの論理積をとり、結果をRnに格納する。特殊形として汎用レジスタR0とゼロ拡張した8ビット・イミディエイト・データとの論理積、もしくはR1相対で8ビット・メモリと8ビット・イミディエート・データとの論理積が可能である。
〔注意〕AND #imm,R0では演算の結果、R0の上位24ビットは常にクリアされる。
Figure 0003539914
〔コード〕
AND r,R;(MSB)0001RRRRrrrr1001(LSB)
AND #imm,R0;(MSB)10001001iiiiiiii(LSB)
AND.B #imm,@R1;(MSB)10000001iiiiiiii(LSB)
【0076】
《BC/BF/BT(条件付分岐)命令》
〔書式〕
BC disp
BF disp
BT disp
〔説明〕
T/Cビットを参照する条件付き分岐命令である。T=1のとき、BTは分岐するが、BFは次の命令を実行する。逆にT=0のとき、BFは分岐するが、BTは次の命令を実行する。BCはC=1のとき分岐するが、C=0のときは次の命令を実行する。分岐先はPCにディスプレースメントを加えたアドレスである。PCは、本命令の2命令後の先頭アドレスである。ディスプレースメントは1ビット左シフトされ9ビットであるので、分岐先との相対距離は−256から+254バイトになる。分岐先に届かないときはBRA命令、もしくはJMP命令との組み合わせで対応する。
Figure 0003539914
Figure 0003539914
〔コード〕
BC disp;(MSB)11001100dddddddd(LSB)
BF disp;(MSB)11001010dddddddd(LSB)
BT disp;(MSB)11001000dddddddd(LSB)
【0077】
《BRA(無条件分岐)命令》
〔書式〕
BRA disp
〔説明〕
無条件の遅延分岐命令である。分岐先はPCにディスプレースメントを加えたアドレスである。PCは、本命令の2命令後の先頭アドレスである。ディスプレースメントは1ビット左シフトされ13ビットであるので、分岐先との相対距離は−4096から+4094バイトになる。分岐先に届かないときはJMP命令への変更が必要である。このとき、分岐先アドレスをMOV命令でレジスタに転送しておく必要が有る。
〔注意〕
遅延分岐命令であるので、本命令の直後の命令が分岐に先立ち実行される。本命令と直後の命令との間に割り込みは受け付けられない。直後の命令が分岐命令のとき、不当命令として認識される。
〔動作〕
BRA(long d) /* BRA disp */
{
unsigned long temp;
long disp;
if ((d&0x800)==0) disp=(0x00000FFF & d);
else disp=(0xFFFFF000 | d);
temp=PC;
PC=PC+(disp<<1)+4;
Delay_Slot(temp+2);
}
〔使用例〕
BRA TRGET ;TRGETへ分岐する。
ADD R0,R1 ;分岐に先立ち実行される。
NOP ;BRA命令で分岐先アト゛レス計算に用いるPCの位置
TRGET: ;BRA命令の分岐先
〔コード〕
BRA disp;(MSB)1010dddddddddddd(LSB)
【0078】
《BRK(ソフトウェアブレイク)命令》
〔書式〕
BRK
〔説明〕
ブレーク例外処理を開始する。すなわち、外部デバイスにアクノリッジ信号を返した後、PCをBRに退避し、所定のベクタに従いブレーク割り込みルーチンへ分岐する。PCは本命令の先頭アドレスである。ベクタアドレスの計算に、VBRの内容は無関係である。RTBと組み合わせて、ブレークルーチン・コールに使用する。
〔注意〕
本命令は割り込みを受け付けない。BRはブレイク端子によるハードウェアブレイクと共用される。従って、ブレイク処理中のブレイク再要求は避けるべきである。PCはBRに保護されるが、SRは保護されない。必要であればSTC命令でレジスタ、あるいはメモリに退避しなければならない。
Figure 0003539914
〔使用例〕
CMP/EQ R0,R1 ;
BT _TRUE ;R0≠R1のときブレークする。
BRK ;ブレークルーチンからの戻り先である
・・・・・・・
BREAK: ;ブレークルーチンの入り口
MOV R0,R0 ;
RTB ;上記BRK命令に戻る。
〔コード〕
BRK;(MSB)0000000000000000(LSB)
【0079】
《BSR(プロシージャコール)命令》
〔書式〕
BSR disp
〔説明〕
指定されたアドレスのプロシージャに分岐する。PCの内容をPRに退避し、PCにディスプレースメントを加えたアドレスへ分岐する。PCは、本命令の2命令後の先頭アドレスである。ディスプレースメントは1ビット左シフトされ13ビットであるので、分岐先との相対距離は−4096から+4094バイトになる。分岐先に届かない場合にはJSR命令への変更が必要である。このとき、分岐先アドレスをMOV命令でレジスタに転送しておく必要がある。RTSと組み合わせて、プロシージャ・コールに使用する。
〔注意〕
遅延分岐命令であるので、本命令の直後の命令が分岐に先立ち実行される。本命令と直後の命令との間に割り込みは受け付けられない。直後の命令が分岐命令のとき、不当命令として認識される。
Figure 0003539914
〔使用例〕
BSR TRGET ;TRGETへ分岐する。
MOV R3,R4 ;分岐に先立ち実行される。
ADD R0,R1 ;BSR命令で分岐先アト゛レス計算に用いるPCの位置
・・・・・・・ プロシージャからの戻り先である
・・・・・・・
TRGET: ;プロシージャの入り口
MOV R2,R3 ;
RTS ;上記ADD命令に戻る。
MOV #1,R0 ;分岐に先立ち実行される。
〔コード〕
BSR disp;(MSB)1110dddddddddddd(LSB)
【0080】
《CLRC(Cビットクリア)命令》
〔書式〕
CLRC
〔説明〕
SRのCビットをクリアする。
〔動作〕
CLRC() /* CLRC */
{
C=0;
PC+=2;
}
〔使用例〕
CLRC ;実行前 C=1
;実行後 C=0
〔コード〕
CLRC;(MSB)0000000000101001(LSB)
【0081】
《CLRT(Tビットクリア)命令》
〔書式〕
CLRT
〔説明〕
SRのTビットをクリアする。
〔動作〕
CLRT() /* CLRT */
{
T=0;
PC+=2;
}
〔使用例〕
CLRT ;実行前 T=1、;実行後 T=0
〔コード〕
CLRT;(MSB)0000000000101000(LSB)
【0082】
《CMP/cond(オペランド比較)命令》
〔書式〕
CMP/cond Rm,Rn
〔説明〕
汎用レジスタRnとRmとを比較し、その結果、指定された条件(cond)が成立しているとSRのTビットをセットする。条件が不成立のときはTビットはクリアされる。Rnの内容は変化しない。8条件が指定できる。PZとPLの2条件についてはRnと0との比較になる。
ニーモニック ;説明
CMP/EQ Rm,Rn ;Rn=RmのときT=1
CMP/GE Rm,Rn ;有符号値としてRn≧RmのときT=1
CMP/GT Rm,Rn ;有符号値としてRn>RmのときT=1
CMP/HI Rm,Rn ;無符号値としてRn>RmのときT=1
CMP/HS Rm,Rn ;無符号値としてRn≧RmのときT=1
CMP/PL Rn ;Rn>0のときT=1
CMP/PZ Rn ;Rn≧0のときT=1
CMP/STR Rm,Rn ;何れかのバイトが等しいときT=1
Figure 0003539914
Figure 0003539914
〔使用例〕
CMP/GE R0,R1 ;R0=H'7FFFFFFF,R1=H'80000000
BT TRGET_T ;T=0なので分岐しない
CMP/HS R0,R1 ;R0=H'7FFFFFFF,R1=H'80000000
BT TRGET_T ;T=1なので分岐する
CMP/STR R2,R3 ;R2="ABCD",R3="XYCZ"
BT TRGET_T ;T=1なので分岐する
〔コード〕
CMP/EQ r,R;(MSB)0001RRRRrrrr0000(LSB)
CMP/GE r,R;(MSB)0001RRRRrrrr0011(LSB)
CMP/GT r,R;(MSB)0001RRRRrrrr0111(LSB)
CMP/HI r,R;(MSB)0001RRRRrrrr0110(LSB)
CMP/HS r,R;(MSB)0001RRRRrrrr0010(LSB)
CMP/PL R;(MSB)0100RRRR00011101(LSB)
CMP/PZ R;(MSB)0100RRRR00011001(LSB)
CMP/STR r,R;(MSB)0010RRRRrrrr1100(LSB)
【0083】
《DIV0S/DIV0U/DIV1(ステップ除算)命令》
〔書式〕
DIV1 Rm,Rn
DIV0S Rm,Rn
DIV0U
〔説明〕
汎用レジスタRnの内容32ビットをRmの内容で1ステップ除算し、結果の1ビットをSRのCビットに格納する。DIV0Sは符号付き除算用の初期化命令で被除数(Rn)のMSBをQビットに、除数(Rm)のMSBをMビットに、MビットとQビットのEORをCビットに格納する。DIV0Uは符号無し除算用の初期化命令で、M/Q/Cビットを0にクリアする。DIV1を(必要であればROTCLと組みで)除数のビット数分繰り返すことによって、商を得る。この繰り返し中は、指定したレジスタとSRのM/Q/Cビットに中間結果が格納される。これらを不必要にソフトウェアで書き替えると演算結果は保証されない。除算のシーケンスは下記使用例を参考にする事ができる。ゼロ除算とオーバーフローの検出、および剰余の演算は用意されていない。
Figure 0003539914
Figure 0003539914
Figure 0003539914
Figure 0003539914
〔使用例1〕 R1(32bit)÷R0(16bit)=R1(16bit):符号無し
SL16 R0 ;除数を上位16bit、下位16bitを0に設定
TEST R0,R0 ;ゼロ除算チェック
BT ZERO_DIV ;
CMP/HS R0,R1 ;オーバーフローチェック
BT OVER_DIV ;
DIV0U ;フラグの初期化
.arepeat 16 ;
DIV1 R0,R1 ;16回繰り返し
.aendr ;
ROTCL R1 ;
EXTU.W R1,R1 ;R1=商
〔使用例2〕 R1:R2(64bit)÷R0(32bit)=R2(32bit):符号無し
TEST R0,R0 ;ゼロ除算チェック
BT ZERO_DIV ;
CMP/HS R0,R1 ;オーバーフローチェック
BT OVER_DIV ;
DIV0U ;フラグの初期化
.arepeat 32 ;
ROTCL R2 ;32回繰り返し
DIV1 R0,R1 ;
.aendr ;
ROTCL R2 ;R2=商
〔使用例3〕 R1(16bit)÷R0(16bit)=R1(16bit):符号付き
SL16 R0 ;除数を上位16bit、下位16bitを0に設定
EXTS.W R1,R1 ;被除数は符号拡張して32bit
EOR R2,R2 ;R2=0
MOV R1,R3 ;
ROTCL R3 ;
SUBC R2,R1 ;被除数が負のとき、−1する
DIV0S R0,R1 ;フラグの初期化
.arepeat 16 ;
DIV1 R0,R1 ;16回繰り返し
.aendr ;
EXTS.W R1,R1 ;R1=商(1の補数表現)
ROTCL R1 ;
ADDC R2,R1 ;商のMSBが1のとき、+1して2の補数表現に変換
EXTS.W R1,R1 ;R1=商(2の補数表現)
〔使用例4〕
R2(32bit)÷R0(32bit)=R2(32bit):符号付き
EOR R3,R3 ;
MOV R2,R4 ;
ROTCL R4 ;
SUBC R1,R1 ;被除数は符号拡張して64bit(R1:R2)
SUBC R3,R2 ;被除数が負のとき、−1する
DIV0S R0,R1 ;フラグの初期化
.arepeat 32 ;
ROTCL R2 ;32回繰り返し
DIV1 R0,R1 ;
.aendr ;
ROTCL R2 ;R2=商(1の補数表現)
ADDC R3,R2 ;商のMSBが1のとき、+1して2の補数表現に変換、
;R2=商(2の補数表現)
〔コード〕
DIV1 r,R;(MSB)0001RRRRrrrr1100(LSB)
DIV0S r,R;(MSB)0001RRRRrrrr1101(LSB)
DIV0U ;(MSB)0000000000101010(LSB)
【0084】
《EOR(排他的論理和)命令》
〔書式〕
EOR Rm,Rn
EOR #imm,R0
EOR.B #imm,@R1
〔説明〕
汎用レジスタRnの内容とRmの排他的論理和をとり、結果をRnに格納する。特殊形として汎用レジスタR0とゼロ拡張した8ビット・イミディエート・データとの排他的論理和、もしくはR1相対で8ビット・メモリと8ビット・イミディエート・データとの排他的論理和が可能である。
Figure 0003539914
〔コード〕
EOR r,R ;(MSB)0001RRRRrrrr1010(LSB)
EOR #imm,R0 ;(MSB)10001010iiiiiiii(LSB)EOR.B #imm,@R1 ;(MSB)10000010iiiiiiii(LSB)
【0085】
《EXTS(符号拡張)命令》
〔書式〕
EXTS.B Rm,Rn
EXTS.W Rm,Rn
〔説明〕
汎用レジスタRmの内容を符号拡張して、結果をRnに格納する。バイト指定のとき、Rmのビット7の内容をビット8からビット31にコピーする。ワード指定のとき、Rmのビット15の内容をビット16からビット31にコピーする。
Figure 0003539914
〔使用例〕
EXTS.B R0,R1 ;実行前 R0=H'00000080、;実行後 R1=H'FFFFFF80
EXTS.W R0,R1 ;実行前 R0=H'00008000、;実行後 R1=H'FFFF8000
〔コード〕
EXTS.B r,R ;(MSB)0110RRRRrrrr0010(LSB)
EXTS.W r,R ;(MSB)0110RRRRrrrr0011(LSB)
【0086】
《EXTU(ゼロ拡張)命令》
〔書式〕
EXTU.B Rm,Rn
EXTU.W Rm,Rn
〔説明〕
汎用レジスタRmの内容をゼロ拡張して、結果をRnに格納する。バイト指定のとき、Rnのビット8からビット31に0が入る。ワード指定とき、Rnのビット16からビット31に0が入る。
Figure 0003539914
〔コード〕
EXTU.B r,R;(MB)0110RRRRrrrr0000(LSB)
EXTU.W r,R;(MSB)0110RRRRrrrr0001(LSB)
【0087】
《JMP(無条件ジャンプ)命令》
〔書式〕
JMP @Rn
〔説明〕
指定されたアドレスに無条件に遅延分岐する。分岐先は汎用レジスタRnの内容の32ビットデータで表わされるアドレスである。
〔注意〕
遅延分岐命令であるので、本命令の直後の命令が分岐に先立ち実行される。本命令と直後の命令との間に割り込みは受け付けられない。直後の命令が分岐命令のとき、不当命令として認識される。
Figure 0003539914
〔コード〕
JMP @R;(MSB)0100RRRR00001010(LSB)
【0088】
《JSR(プロシージャコール)命令》
〔書式〕
JSR @Rn
〔説明〕
指定されたアドレスのプロシージャに分岐する。PCの内容をPRに退避し、汎用レジスタRnの内容の32ビットデータで表わされるアドレスへ分岐する。PCは、本命令の2命令後の先頭アドレスである。RTSと組み合わせて、プロシージャ・コールに使用する。
〔注意〕
遅延分岐命令であるので、本命令の直後の命令が分岐に先立ち実行される。本命令と直後の命令との間に割り込みは受け付けられない。直後の命令が分岐命令のとき、不当命令として認識される。
Figure 0003539914
〔コード〕
JSR @R;(MSB)0100RRRR00001011(LSB)
【0089】
《LDC(CR転送)命令》
〔書式〕
LDC Rm,CRn
LDC.L @Rm+,CRn
〔説明〕
ソース・オペランドをコントロールレジスタCRnに格納する。
〔注意〕
本命令は割り込みを受け付けない。
Figure 0003539914
〔コード〕
LDC R,cr;(MSB)0100RRRRrrrr0010(LSB)
LDC.L @R+,cr;(MSB)0100RRRRrrrr0001(LSB)
【0090】
《LDBR(BR転送)命令》
〔書式〕
LDBR
〔説明〕
汎用レジスタR0の内容をコントロールレジスタBRに格納する。
〔注意〕
本命令は割り込みを受け付けない。
Figure 0003539914
〔コード〕
LDBR;(MSB)0000000000100001(LSB)
【0091】
《LDVR(VBR転送)命令》
〔書式〕
LDVR
〔説明〕
汎用レジスタR0の内容をコントロールレジスタVBRに格納する。
〔注意〕
本命令は割り込みを受け付けない。
Figure 0003539914
〔コード〕
LDVR;(MSB)0000000000001011(LSB)
【0092】
《MOV(イミディエート・データ転送)命令》
〔書式〕
MOV #imm,Rn
MOV.W @(disp,PC),Rn
MOV.L @(disp,PC),Rn
〔説明〕
汎用レジスタRnにイミディエート・データを格納する。データは32ビットに符号拡張される。データがワード/ロングワードのときは、PCにディスプレースメントを加えたアドレスに格納されたテーブル内のデータを参照する。データがワードのとき、ディスプレースメントは1ビット左シフトされ9ビットであるので、テーブルとの相対距離は−256から+254バイトになる。PCは本命令の2命令後の先頭アドレスである。従って、ワード・データは2バイト境界に配置する必要がある。データがロングワードのとき、ディスプレースメントは2ビット左シフトされ10ビットであるので、オペランドとの相対距離は−512から+508バイトになる。PCは本命令の2命令後の先頭アドレスであるが、PCの下位2ビットはB,00に補正される。従って、ロングワード・データは4バイト境界に配置する必要がある。
〔注意〕
テーブルは自動的にスキップされないので、何も対策しないと命令と解釈される。これを避けるためモジュール先頭、あるいは無条件分岐命令の後などに配置することが必要である。ただし不注意にBSR/JSR/TRAPの直後に配置すると、単純にリターンしたときテーブルに衝突することになる。本命令が遅延分岐命令の直後に配置されているとき、PCは分岐先の先頭アドレス+2になる。本命令のテーブル・アクセスはインストラクション・キャッシュの対象となる。
Figure 0003539914
Figure 0003539914
〔コード〕
MOV #imm,R;(MSB)1101RRRRiiiiiiii(LSB)
MOV.W @(disp,PC),R;(MSB)1001RRRRdddddddd(LSB)
MOV.L @(disp,PC),R;(MSB)1011RRRRdddddddd(LSB)
【0093】
《MOV(スタックデータ転送)命令》
〔書式〕
MOV.L @(disp,Rm),Rn
MOV.L Rm,@(disp,Rn)
〔説明〕
ソース・オペランドをデスティネーションへ転送する。メモリオペランドはスタック・フレームに存在するのでデータ・サイズはロングワードに限定される。従ってディスプレースメントは2ビット左シフトされ6ビットであるので、−32から+28バイトが指定できる。メモリオペランドに届かないときは一般のMOV命令を使う。ただし使用するレジスタが固定されているなどの制限がある。
Figure 0003539914
〔コード〕
MOV.L @(disp,r),R;(MSB)0111RRRRrrrrdddd(LSB)
MOV.L r,@(disp,R);(MSB)0011RRRRrrrrdddd(LSB)
【0094】
《MOV(I/Oデータ転送)命令》
〔書式〕
MOV @(disp,GBR),R0
MOV R0,@(disp,GBR)
〔説明〕
ソース・オペランドをデスティネーションへ転送する。メモリオペランドのデータ・サイズをバイト/ワード/ロングワードの範囲で指定できる。I/OのベースアドレスをGBRに設定する。I/Oのデータがバイト・サイズのときディスプレースメントは8ビットであるので、−128から+127バイトが指定できる。ワード・サイズのときディスプレースメントは1ビット左シフトされ9ビットであるので、−256から+254バイトが指定できる。ロングワード・サイズのときディスプレースメントは2ビット左シフトされ10ビットであるので、−512から+508バイトが指定できる。メモリオペランドに届かないときは一般のMOV命令を使う。ソース・オペランドがメモリのとき、ロードされたデータは32ビットに符号拡張されてレジスタに格納される。
〔注意〕
ロードするときデスティネーション・レジスタがR0固定である。従って、直後の命令でR0を参照しようとしてもロード命令の実行完了まで待たされる。下記の→▲1▼と▲1▼→、→▲2▼と▲2▼→で対応されるように命令の順序変えによる最適化が必要である。
MOV.B @(12,GBR),R0 MOV.B @(12,GBR),R0
AND #80,R0 →▲2▼ ▲1▼→ ADD #20,R1
ADD #20,R1 →▲1▼ ▲2▼→ AND #80,R0
Figure 0003539914
Figure 0003539914
〔コード〕
MOV @(disp,GBR),R0;(MSB)110011SSdddddddd(LSB)
MOV R0,@(disp,GBR);(MSB)100011SSdddddddd(LSB)
但し、SSはサイズであり、01=バイト、10=ワード、11=ロングワードである。
【0095】
《MOV(転送)命令》
〔書式〕
MOV Rm,Rn
MOV @Rm,Rn
MOV Rm,@Rn
MOV @Rm+,Rn
MOV Rm,@−Rn
MOV @(disp,R1),R0
MOV R0,@(disp,R1)
MOV @(Rm,R1),Rn
MOV Rm,@(Rn,R1)
〔説明〕
ソース・オペランドをデスティネーションへ転送する。オペランドがメモリのときは転送するデータ・サイズをバイト/ワード/ロングワードの範囲で指定できる。ソース・オペランドがメモリのとき、ロードされたデータは32ビットに符号拡張されてレジスタに格納される。@(disp,R1)モードのときメモリのデータがバイト・サイズのときディスプレースメントは8ビットであるので、−128から+127バイトが指定できる。ワード・サイズのときディスプレースメントは1ビット左シフトされ9ビットであるので、−256から+254バイトが指定できる。ロングワード・サイズのときディスプレースメントは2ビット左シフトされ10ビットであるので、−512から+508バイトが指定できる。
〔注意〕
@(disp,R1)モードのとき、他方のオペランドがR0固定である。従って、ロード命令のときは前項のI/Oデータ転送命令と同様に下記の→▲1▼と▲1▼→、→▲2▼と▲2▼→で対応されるように命令の順序変えによって最適化が可能である。
MOV.B @(12,R1),R0 MOV.B @(12,R1),R0
AND #80,R0 →▲2▼ ▲1▼→ ADD #20,R1
ADD #20,R1 →▲1▼ ▲2▼→ AND #80,R0
Figure 0003539914
Figure 0003539914
Figure 0003539914
Figure 0003539914
Figure 0003539914
Figure 0003539914
Figure 0003539914
〔コード〕
MOV r,R;(MSB)0110RRRRrrrr1000(LSB)
MOV @r,R;(MSB)0110RRRRrrrr10SS(LSB)
MOV r,@R;(MSB)0010RRRRrrrr10SS(LSB)
MOV @r+,R;(MSB)0110RRRRrrrr11SS(LSB)
MOV r,@-R;(MSB)0010RRRRrrrr11SS(LSB)
MOV @(r,R1),R;(MSB)0000RRRRrrrr01SS(LSB)
MOV r,@(R,R1);(MSB)0000RRRRrrrr11SS(LSB)
MOV @(disp,R1),R0;(MSB)110001SSdddddddd(LSB)
MOV R0,@(disp,R1);(MSB)100001SSdddddddd(LSB)
但し、SSはサイズであり、01=バイト、10=ワード、11=ロングワードである。
【0096】
《MOVA(実効アドレス・データ転送)命令》
〔書式〕
MOVA @(disp,PC),R1
〔説明〕
汎用レジスタR1にソース・オペランドの実効アドレスを格納する。ディスプレースメントは2ビット左シフトされ10ビットであるので、オペランドとの相対距離は−512から+508バイトになる。PCは本命令の2命令後の先頭アドレスであるが、PCの下位2ビットはB’00に補正される。従って、ソース・オペランドは4バイト境界に配置する必要がある。
〔注意〕
本命令が遅延分岐命令の直後に配置されているとき、PCは分岐先の先頭アドレス+2になる。
Figure 0003539914
〔コード〕
MOVA @(disp,PC),R1;(MSB)11001011dddddddd(LSB)
【0097】
《MULS(符号付き乗算)命令》
〔書式〕
MULS Rm,Rn
〔説明〕
汎用レジスタRnの内容とRmを16ビットで乗算し、結果の32ビットをRnに格納する。演算は符号付き算術演算で行なう。
Figure 0003539914
〔コード〕
MULS r,R;(MSB)0001RRRRrrrr1111(LSB)
【0098】
《MULU(符号なし乗算)命令》
〔書式〕
MULU Rm,Rn
〔説明〕
汎用レジスタRnの内容とRmを16ビットで乗算し、結果の32ビットをRnに格納する。演算は符号なし算術演算で行なう。
Figure 0003539914
〔コード〕
MULU r,R;(MSB)0001RRRRrrrr1110(LSB)
【0099】
《NEG(符号反転)命令》
〔書式〕
NEG Rm,Rn
〔説明〕
汎用レジスタRmの内容の2の補数をとり、結果をRnに格納する。0からRmを減算し、結果をRnに格納する。
Figure 0003539914
〔コード〕
NEG r,R;(MSB)0110RRRRrrrr0110(LSB)
【0100】
《NEGC(キャリ付き符号反転)命令》
〔書式〕
NEGC Rm,Rn
〔説明〕
0から汎用レジスタRmの内容とCビットを減算し、結果をRnに格納する。演算の結果によりボローがCビットに反映される。
Figure 0003539914
〔コード〕
NEGC r,R;(MSB)0110RRRRrrrr0111(LSB)
【0101】
《NOP(無操作)命令》
〔書式〕
NOP
〔説明〕
PCのインクリメントのみを行ない、次の命令に実行が移る。
Figure 0003539914
〔使用例〕
NOP ;1サイクルの時間が過ぎる
〔コード〕
NOP;(MSB)0000000000000010(LSB)
【0102】
《NOT(論理否定)命令》
〔書式〕
NOT Rm,Rn
〔説明〕
汎用レジスタRmの内容の1の補数をとり、結果をRnに格納する。
Figure 0003539914
〔コード〕
NOT r,R;(MSB)0110RRRRrrrr1100(LSB)
【0103】
《OR(論理和)命令》
〔書式〕
OR Rm,Rn
OR #imm,R0
OR.B #imm,@R1
〔説明〕
汎用レジスタRnの内容とRmの論理和をとり、結果をRnに格納する。特殊形として汎用レジスタR0とゼロ拡張した8ビット・イミディエイト・データとの論理和、もしくはR1相対で8ビット・メモリと8ビット・イミディエート・データとの論理和も可能である。
Figure 0003539914
〔コード〕
OR r,R;(MSB)0001RRRRrrrr1011(LSB)
OR #imm,R0;(MSB)10001011iiiiiiii(LSB)
OR.B #imm,@R1;(MSB)10000011iiiiiiii(LSB)
【0104】
《PASS(通過確認)命令》
〔書式〕
PASS #imm
〔説明〕
Dビットを参照する条件付きのソフトウェア割り込み命令である。D=1のときデバッグ割り込みを発生する。逆にD=0のとき、PCのインクリメントだけを行なう。デバッグ割り込みが発生すると、PCとSRをスタックに退避し所定のベクタアドレスの内容で表わされるアドレスへ分岐する。PCは本命令の次命令の先頭アドレスである。プログラム作成時にルーチンの先頭に本命令を埋め込んでおき、必要な時にD=1にすることによってデバッグ割り込みで通過確認を行なうことが可能である。また予め定義するデバッグ割り込みルーチンでimmコードを参照することによって、デバッグ対象ルーチンの判別が可能である。immコードはスタック上のPCを(−1)したアドレスのバイトデータである。
〔注意〕
本命令を分岐命令の直後に配置すると、Dビットの値に関係無く不当命令として認識される。
Figure 0003539914
〔コード〕
PASS #imm;(MSB)11001001iiiiiiii(LSB)
【0105】
《ROTL/ROTR(ローテート)》
〔書式〕
ROTL Rn
ROTR Rn
〔説明〕
図92に示されるように汎用レジスタRnの内容を左/右方向に1ビット・ローテート(回転)し、結果をRnに格納する。ローテートしてオペランドの外に出てしまったビットは、Cビットに転送される。
Figure 0003539914
〔コード〕
ROTL R;(MSB)0100RRRR00101001(LSB)
ROTR R;(MSB)0100RRRR00101000(LSB)
【0106】
《ROTCL/ROTCR(キャリ・ビット付きローテート)命令》
〔書式〕
ROTCL Rn
ROTCR Rn
〔説明〕
図93に示されるように汎用レジスタRnの内容を左/右方向にCビットを含めて1ビット・ローテート(回転)し、結果をRnに格納する。ローテートしてオペランドの外に出てしまったビットは、Cビットに転送される。
Figure 0003539914
〔コード〕
ROTCL R;(MSB)0100RRRR00101011(LSB)
ROTCR R;(MSB)0100RRRR00101010(LSB)
【0107】
RTB(ブレークからのリターン)命令
〔書式〕
RTB
〔説明〕
ブレーク例外処理ルーチンから復帰する。すなわち、PCをBRから復帰した後、外部デバイスにアクノリッジ信号を返し、復帰したPCの示すアドレスから処理が続行される。
〔注意〕
本命令と分岐先命令との間の割り込みは受け付けは、RTBMSK信号で制御できる。RTBMSK信号が入力されていると、NMI/IRQ等の外部割り込みは受け付けられない。(アドレスエラー等は受け付けられる。)
Figure 0003539914
〔使用例〕
MOV R0,R9 ;
ADD #-1,R1 ;←RTBの分岐先(BRに退避されたPC)
TEST R1,R1;
・・・・・・・
NOP ;
RTB ;RTBMSKが入力されていると、必ず上記ADDを実行する。入力されていないと割り込みを受け付け、このとき上記ADDは実行されない
〔コード〕
RTB;(MSB)0000000000000001(LSB)
【0108】
《RTE(例外処理からのリターン)命令》
〔書式〕
RTE
〔説明〕
割り込みルーチンから復帰する。すなわち、PCとSRをスタックから復帰する。復帰したPCの示すアドレスから処理が続行される。
〔注意〕
遅延分岐命令であるので、本命令の直後の命令が分岐に先立ち実行される。本命令と直後の命令との間に割り込みは受け付けられない。直後の命令が分岐命令のとき、不当命令として認識される。メモリからR15へのロード命令の直後に連続して配置しないことが必要である。ロード前の古いR15を誤って参照することになる。下記の→▲1▼と▲1▼→、→▲2▼と▲2▼→で対応されるように命令の順序変えが必要である。
MOV #0,R0 →▲1▼ ▲2▼→ MOV.L @R15+,R15
MOV.L @R15+,R15 →▲2▼ ▲1▼→ MOV #0,R0
RTE RTE
ADD #8,R15 ADD #8,R15
Figure 0003539914
〔使用例〕
RTE ;基のルーチンへ復帰する
ADD #8,R15 ;分岐に先立ち実行される。
〔コード〕
RTE;(MSB)0000000000010000(LSB)
【0109】
RTS(プロシージャからのリターン)命令
〔書式〕
RTS
〔説明〕
プロシージャから復帰する。すなわち、PCをPRから復帰する。復帰したPCの示すアドレスから処理が続行される。本命令によって、BSRおよびJSR命令でコールされたプロシージャからコール元へ戻ることができる。
〔注意〕
遅延分岐命令であるので、本命令の直後の命令が分岐に先立ち実行される。本命令と直後の命令との間に割り込みは受け付けられない。直後の命令が分岐命令のとき、不当命令として認識される。
Figure 0003539914
〔使用例〕
TABEL: .data.l TRGET ;ジャンプテーブル
MOV.L TABLE,R3 ;R3=TRGETのアドレス
JSR @R3 ;TRGETへ分岐する
NOP ;分岐に先立ち実行される
ADD R0,R1 ;PRの保持しているアドレス
・・・・・・ プロシージャからの戻り先である
・・・・・・
TRGET: MOV R1,R0 ;プロシージャの入り口
RTS ;PRの内容−>PC
MOV #12,R0 ;分岐に先立ち実行される
〔コード〕
RTS;(MSB)0000000000010001(LSB)
【0110】
《SETC(Cビットセット)命令》
〔書式〕
SETC
〔説明〕
SRのCビットをセットする。
Figure 0003539914
〔コード〕
SETC;(MSB)0000000000011001(LSB)
【0111】
《SETT(Tビットセット)命令》
〔書式〕
SETT
〔説明〕
SRのTビットをセットする。
Figure 0003539914
〔コード〕
SETT;(MSB)0000000000011000(LSB)
【0112】
《SHAL/SHAR(算術シフト)命令》
〔書式〕
SHAL Rn
SHAR Rn
〔説明〕
図94に示されるように、汎用レジスタRnの内容を左/右方向に算術的に1ビット・シフトし、結果をRnに格納する。シフトしてオペランドの外に出てしまったビットは、Cビットに転送される。
Figure 0003539914
〔コード〕
SHAL R;(MSB)0100RRRR00011011(LSB)
SHAR R;(MSB)0100RRRR00011000(LSB)
【0113】
《SHLL/SHLR(論理シフト)命令》
〔書式〕
SHLL Rn
SHLR Rn
〔説明〕
図95に示されるように、汎用レジスタRnの内容を左/右方向に論理的に1ビット・シフトし、結果をRnに格納する。シフトしてオペランドの外に出てしまったビットは、Cビットに転送される。
Figure 0003539914
〔コード〕
SHLL R;(MSB)0100RRRR00011011(LSB)
SHLR R;(MSB)0100RRRR00011010(LSB)
【0114】
《SLn/SRn(マルチビットシフト)命令》
〔書式〕
SL2 Rn
SR2 Rn
SL8 Rn
SR8 Rn
SL16 Rn
SR16 Rn
〔説明〕
図96に示されるように、汎用レジスタRnの内容を左/右方向に論理的に2/8/16ビット・シフトし、結果をRnに格納する。シフトしてオペランドの外に出てしまったビットは、捨てられる。
Figure 0003539914
Figure 0003539914
〔コード〕
SL2 R;(MSB)0100RRRR00001111(LSB)
SR2 R;(MSB)0100RRRR00001110(LSB)
SL8 R;(MSB)0100RRRR00011111(LSB)
SR8 R;(MSB)0100RRRR00011110(LSB)
SL16 R;(MSB)0100RRRR00101111(LSB)
SR16 R;(MSB)0100RRRR00101110(LSB)
【0115】
《SLP(スリープ)命令》
〔書式〕
SLP
〔説明〕
CPUを低消費電力モードにする。低消費電力モードでは、CPUの内部状態は保持され、直後の命令の実行を停止し、割り込み要求の発生を待つ。要求が発生すると、低消費電力モードから抜けて例外処理を開始する。すなわち、SRとPCをスタックに退避し、所定のベクタに従い割り込みルーチンへ分岐する。PCは本命令の直後の命令の先頭アドレスである。
Figure 0003539914
〔使用例〕
SLP ;低消費電力モードへの遷移
〔コード〕
SLP;(MSB)0000000000001000(LSB)
【0116】
《STC(CR転送)命令》
〔書式〕
STC CRm,Rn
STC.L CRm,@−Rn
〔説明〕
コントロールレジスタCRmをデスティネーションに格納する。
〔注意〕
本命令は割り込みを受け付けない。
Figure 0003539914
〔コード〕
STC cr,R;(MSB)0000RRRRrrrr0011(LSB)
STC.L cr,@-R;(MSB)0100RRRRrrrr0000(LSB)
【0117】
《STBR(BR転送)命令》
〔書式〕
STBR
〔説明〕
コントロールレジスタBRの内容を汎用レジスタR0に格納する。
〔注意〕
本命令は割り込みを受け付けない。
Figure 0003539914
〔コード〕
STBR;(MSB)0000000000100000(LSB)
【0118】
《STVR(VBR転送)命令》
〔書式〕
STVR
〔説明〕
コントロールレジスタVBRの内容を汎用レジスタR0に格納する。
〔注意〕
本命令は割り込みを受け付けない。
Figure 0003539914
〔コード〕
STVR;(MSB)0000000000001010(LSB)
【0119】
《SUB(減算)命令》
〔書式〕
SUB Rm,Rn
〔説明〕
汎用レジスタRnの内容からRmを減算し、結果をRnに格納する。イミディエート・データとの減算はADD #imm,Rnで代用する。
Figure 0003539914
〔コード〕
SUB r,R;(MSB)0010RRRRrrrr0100(LSB)
【0120】
《SUBC(キャリ付き減算)命令》
〔書式〕
SUBC Rm,Rn
〔説明〕
汎用レジスタRnの内容からRmとCビットを減算し、結果をRnに格納する。演算の結果によりボローがCビットに反映される。
Figure 0003539914
〔コード〕
SUBC r,R;(MSB)0010RRRRrrrr0110(LSB)
【0121】
《SUBS(飽和機能付き減算)命令》
〔書式〕
SUBS Rm,Rn
〔説明〕
汎用レジスタRnの内容からRmを減算し、結果をRnに格納する。アンダーフローが発生しても、結果はH'7FFFFFFF〜H'80000000の範囲に制限される。このとき、Cビットがセットされる。
Figure 0003539914
〔コード〕
SUBS r,R;(MSB)0010RRRRrrrr0111(LSB)
【0122】
《SUBV(アンダーフロー付き減算)命令》
〔書式〕
SUBV Rm,Rn
〔説明〕
汎用レジスタRnの内容からRmを減算し、結果をRnに格納する。アンダーフローが発生した場合、Cビットがセットされる。
Figure 0003539914
〔コード〕
SUBV r,R;(MSB)0010RRRRrrrr0101(LSB)
【0123】
《SWAP(交換)命令》
〔書式〕
SWAP.B Rm,Rn
SWAP.W Rm,Rn
〔説明〕
汎用レジスタRmの内容の上位と下位を交換して、結果をRnに格納する。バイト指定のとき、Rmのビット0からビット7の8ビットと、ビット8からビット15の8ビットが交換される。Rnに格納されるときはRmの上位16ビットはそのままRnの上位16ビットに転送される。ワード指定のとき、Rmのビット0からビット15の16ビットと、ビット16からビット31の16ビットが交換される。
Figure 0003539914
〔コード〕
SWAP.B r,R;(MSB)0110RRRRrrrr0100(LSB)
SWAP.W r,R;(MSB)0110RRRRrrrr0101(LSB)
【0124】
《TAS(リード・モディファイ・ライト)命令》
〔書式〕
TAS.B @Rn
〔説明〕
汎用レジスタRnの内容をアドレスとし、そのアドレスの示すバイト・データがゼロのときT=1、ゼロでないときT=0とする。その後、ビット7を1にセットして書き込む。この間、バス権は解放されない。
Figure 0003539914
〔使用例〕
_LOOP TAS.B @R7 ;R7=1000
BF _LOOP ;1000番地がゼロになるまでループする。
〔コード〕
TAS.B @R;(MSB)0100RRRR00001000(LSB)
【0125】
《TEST(テスト)命令》
〔書式〕
TEST Rm,Rn
TEST #imm,R0
TEST.B #imm,@R1
〔説明〕
汎用レジスタRnの内容とRmの論理積をとり、結果がゼロのときTビットをセットする。結果が否ゼロのときTビットはクリアされる。Rnの内容は変更されない。特殊形として汎用レジスタR0とゼロ拡張した8ビット・イミディエート・データとの論理積、もしくはR1相対で8ビット・メモリと8ビット・イミディエート・データとの論理積も可能である。メモリの内容は変更されない。
Figure 0003539914
〔コード〕
TEST r,R;(MSB)0001RRRRrrrr1000(LSB)
TEST #imm,R0;(MSB)10001000iiiiiiii(LSB)
TEST.B #imm,@R1;(MSB)10000000iiiiiiii(LSB)
【0126】
《TRAP(ソフトウエアトラップ)》
〔書式〕
TRAP #imm
〔説明〕
トラップ例外処理を開始する。すなわちPCとSRをスタックに退避し、指定ベクタの内容で表わされるアドレスへ分岐する。ベクタはイミディエートデータを2ビット左シフトし符号拡張したメモリアドレスそのものである。PCは本命令の2命令後の先頭アドレスである。RTEと組み合わせて、システム・コールに使用する。
〔注意〕
遅延分岐であるので、本命令の直後の命令が分岐に先立ち実行される。本命令と直後の命令との間に割り込みは受け付けられない。直後の命令が分岐命令のとき、不当命令として認識される。メモリからR15へのロード命令の直後に連続して配置しないことが必要である。ロード前の古いR15を誤って参照することになる。下記の→▲1▼と▲1▼→、→▲2▼と▲2▼→で対応されるように命令の順序変えが必要である。
MOV #0,R0 →▲1▼ ▲2▼→ MOV.L @R15+,R15
MOV.L @R15+,R15 →▲2▼ ▲1▼→ MOV #0,R0
TRAP #15 TRAP #15
Figure 0003539914
〔使用例〕
アト゛レス
0010 .data.l 10000000 ;
・・・・・・・
TRAP #H'10 ;H'10番地の内容のアドレスに分岐する
ADD R1,R7 ;分岐に先立ち実行される
TEST #0,R0 ;トラップルーチンの戻り先
・・・・・・・
10000000 MOV R0,R0 ;トラップルーチンの入り口
10000002 RTE ;上記TEST命令に戻る。
10000004 NOP ;RTEに先立ち実行される
〔コード〕
TRAP #imm;(MSB)11000011iiiiiiii(LSB)
【0127】
《XTRCT(切り出し)命令》
〔書式〕
XTRCT Rm,Rn
〔説明〕
図97に示されるように、汎用レジスタRmとRnとを連結した64ビットの内容から中央の32ビットを切り出し、結果をRnに格納する。
Figure 0003539914
〔コード〕
XTRCT r,R;(MSB)0010RRRRrrrr1000(LSB)
【0128】
次に上記実施例で説明したマイクロコンピュータなどを用いて行うことができる符号付き除算の実施例について説明していく。
【0129】
〔18〕符号付除算における被除数に対する前処理の原理
【0130】
図29には本実施例に係る符号付き除算における被除数に対する前処理の原理が概念的に示してある。例えばY(商)=X(被除数)÷3(除数)で表される符号付き除算において、被除数Xが負のときは被除数Xから1を引いた値(X−1)を被除数とする。概念的には同図に示されるように商Yの座標軸を左側に1ずらした状態で除算の処理を行う。これによって、商を求める演算処理の途上で従来のように部分剰余が0であるか否かをその都度判定しなくても済み、且つ、その判定のためのハードウェアも不要とされる。正確な余りを求めるときは、最後に求まった余りを補正する。
【0131】
〔19〕符号付き除算の原理的な一例処理手順
【0132】
図30には被除数が負の場合における符号付き除算処理の原理的な一例処理手順が示される。同図においては、−9÷−3を一例とする。−9は2の補数表現で”110111”とされ、−3は”101とされる。先ず被除数は負であるから−9から1を引いた値”110110”が被除数とされる。商の符号は被除数の符号”1”と除数の符号”1”の排他的論理和から求められる(*1)。最初の部分剰余の算出は、被除数”110110”と、除数の符号ビットを上位側(左側)に拡張した”1101”とを符号ビットの桁を合せて加算又は減算することによって行われる。双方の符号ビットの排他的論理和が0ならば減算とされ、1ならば加算とされる(*2)。この例の場合には減算とされる。これによって最初の部分剰余”000010”が得られる。第1の部分剰余に対応される商は部分剰余の最上位ビットと除数の符号ビットとの排他的論理和の反転論理値によって与えられる(*3)。以下同様にして順次商ビットが求められる。正確な余りが必要な場合には、この例に従えば最後の剰余に1を足す。同図のした側に示されるように被除数をそのままの値”110111”にして除算を行った場合には剰余の全ビットが”0”にされることに起因して正し商ビットをそのまままでは求められない。そのためには、部分剰余の全ビットが”0”であるか否かを部分剰余を算出する度に判定し、そうである場合には当該商ビットの論理値を反転しなければならない。尚図31には負÷正の場合における符号付き除算処理の一例が示され、図32には正÷正の場合および正÷負の場合における符号付き除算処理のそれぞれ一例が示される。
【0133】
〔20〕符号付き除算処理の全体的な処理手順
【0134】
図33には上記説明から概略が理解されたと考えられる本実施例に係る符号付き除算の基本的な約束ごと若しくは基本的な処理手順の全体が一般的形式で示される。
【0135】
《1》被除数に対する補正を行う。すなわち、図34の(A)に示されるように被除数が負の場合には被除数から1を引く。この処理は、被除数の符号を調べて個別的に行うこともできるが、本実施例では、被除数の符号ビットを抽出し、被除数からその符号ビットを引く手法を採用する。すなわち、被除数のMSBである符号ビットを引く操作を除算の前処理として採用する。被除数が負のとき被除数のMSBは1であるから被除数から1が差引かれる。被除数が正のときそのMSBは0であるから被除数はそのままにされる。このように被除数からそのMSBを差引く処理を採用することにより、被除数が正であるか負であるかを考慮することなく除算プログラムを作成することができ、しかもその様な判定動作を要しないため除算処理が高速化し、その上、被除数が正であるか負であるかにかかわらず同一の回路を利用して除算を行うことができる。
【0136】
ここで、被除数から差引くべき1とは、被除数のLSBの重みを持った1として理解する。前記1を差引くべき被除数のビット位置若しくは桁は被除数の最下位ビット(LSB)である。あえてこのような説明をするのは、前述のように、被除数が固定小数点数である場合を考慮したものである。また、被除数が負のときの符号ビットは1で、正のときの符号ビットは0であることに着目すると、被除数からその符号ビット(被除数のMSB)を差引けば、負の被除数から1を引いたことになる。これは、2の補数表現の負の整数から1の補数表現への変換とみなすことができる。このようにすれば、被除数が正か負かを考慮しなくても被除数に対する前処理を行うことができる。図35には例えば、4ビットの負の整数から1を引いた変換状態が示される。有限ビット数の2の補数の最小値を1の補数に変換するには1ビット余分に必要であるので、必要な場合は1ビット拡張する。また、部分剰余は正になることもあるので、負の整数に対して行った上記の変換を整数全体に拡張し、新しい整数の表現を導入する。例えば、4ビット符号付き整数の範囲では図36に示されるような表現が採用される。尚、任意の整数をその数から1を引いた数で表現したものをZZとすると、2の補数を用いた整数に対し1を引く変換を行ったZZの表現は0以下の整数では1の補数と同一視でき、0以上の整数では本来の値より1だけ小さい数で表現される。このとき、0の符号ビットは負の数と同じ1となる。
【0137】
《2》図34の(B)に示されるように被除数と除数から商の符号を求める。すなわち被除数の符号と除数の符号との排他的論理和から商の符号を予測する。
【0138】
《3》順次部分剰余を求めながら商ビットを立てていく。部分剰余を求めるための加算並びに減算指令は図37の(A)に従って決定される。すなわち部分剰余(又は被除数)の符号Qと除数の符号Mの排他的論理和が0なら減算が指令され、概略的には部分剰余(又は被除数)から除数が差し引かれる。部分剰余(又は被除数)の符号Qと除数の符号Mの排他的論理和が1なら加算が指令され、概略的には部分剰余(又は被除数)に除数が加算される。商ビットは図37の(B)に示されるように前記減算または加算後の部分剰余の符号ビットと除数の符号ビットの排他的論理和の結果を反転して得られる。
【0139】
ここで商ビットの算出方法を更に詳細に説明する。商ビットの算出手法をまとめた内容は、図37の(B)に示され、その算出手法は以下のa),b),c),d)に分類される。
a)A÷B (A≧0、B>0、AとBは2の補数)の場合
公知のように、部分剰余の符号ビットが0のとき商ビットを1、部分剰余の符号ビットが1のとき商ビットを0とする。
b)A÷B (A≧0、B<0、AとBは2の補数)の場合
商が負となるので、(a)の場合と商ビットの立て方を逆にする。つまり、部分剰余の符号ビットが0のとき商ビットを0、部分剰余の符号ビットが1のとき商ビットを1とする。商は1の補数となる。前記の《4》で述べられるが、商ビットが全て求まったら最後に2の補数に変換する。
c)A÷B (A<0、B<0、AとBは2の補数)の場合
あらかじめ被除数から被除数のLSBの重みをもつ1を引いておく。被除数と部分剰余の負の表現は1の補数となり、正の表現は本来の値よりLSBの重みをもつ1だけ小さくなる。0以下の場合符号ビットMSBが1となり、0より大きい場合符号ビットMSBが0となる。商は正となるので、部分剰余の符号ビットMSBが1のとき商ビットを1とし、部分剰余の符号ビットMSBが0のとき商ビットを0とする。
d)A÷B (A<0、B>0、AとBは2の補数)の場合
あらかじめ被除数から被除数のLSBの重みをもつ1を引いておく。被除数と部分剰余の負の表現は1の補数となり、正の表現は本来の値よりLSBの重みをもつ1だけ小さくなる。0以下の場合符号ビットMSBが1となり、0より大きい場合符号ビットMSBが0となる。商は負となるので、(c)の場合と商ビットの立て方を逆にする。部分剰余の符号ビットMSBが1のとき商ビットを1とし、部分剰余の符号ビットMSBが0のとき商ビットを0とする。商は1の補数となる。後述の《4》で述べられるが、商ビットが全て求まったら最後に2の補数に変換する。
【0140】
《4》前記《3》で得られた商は、商の符号により必ずしも正確な値になっていないことがある。前記《2》で求めた商の符号が1のときには商は1の補数になっているからである。したがって、最終的な商は、前記商の符号と商ビットにしたがって決定される。図38に示されるように、商が負(商の符号ビットが1)の場合には商は1の補数で表現されているので、《3》で得られた商に1を足して2の補数に変換する補正を行う。これによって正しい商が求まる。更に図38に示されるように最終部分剰余に対する剰余補正を行う。
【0141】
〔21〕符号付き除算の具体例
【0142】
図39及び図40には符号付き除算の上記基本的な手順を採用した処理の具体的な一例が示される。同図に示される例は−8÷−3の符号付き除算であり、理解を容易にするために6ビットの汎用レジスタを使用した説明とする。図40は、図39に示される最後の処理に引き続いて実行される処理が示され、列方向の記述の意味は図39に一致されている。各図においてR0〜R4は夫々6ビットの汎用レジスタを意味し、Q,M,Tはコントロールレジスタ若しくはステータスレジスタ中のビットフラグを意味し、Qは被除数又は部分剰余の符号を格納するビット、Mは除数の符号を格納するビット、Tは商ビットやキャリーを格納するビットである。図中の左端には命令コードとオペランドが記載され、それに対応する列には汎用レジスタ及びビットフラグの内容が示される。この汎用レジスタ及びビットフラグの内容を示す記述においてアンダーラインが付された内容は対応命令の実行によってその内容が更新されたことを意味する。×が書かれたビットは値が確定していないビットを意味する。以下この項において符号付き除算処理を順次説明するが、先ずその説明で使用する記号についての凡例を以下に示す。
←;格納することを表す。
MSB(Rn);レジスタRnのMSB(最上位ビット)を表す。
LSB(Rn);レジスタRnのLSB(最下位ビット)を表す。
^;排他的論理和を表す演算子である。
Rn<<=1;レジスタRnの値を1ビット左シフトすることを表す。
Rn>>=1;レジスタRnの値を1ビット右シフトすることを表す。
(Q:Rn);レジスタRnの最上位にQビットを付加した7ビットの2進数を意味する。
(M:Rn);レジスタRnの最上位にMビットを付加した7ビットの2進数を意味する。
〜;否定(ビット反転)を意味する演算子である。
(Rn:T)を右回転;TビットをレジスタRnのMSBにシフトインしながらレジスタRnの値を右シフトし、シフトアウトされた値のLSBをTビットに格納することを表す。
(Rn:T)を左回転;TビットをレジスタRnのLSBにシフトインしながらレジスタRnの値を左シフトし、シフトアウトされた値のMSBをTビットに格納することを表す。
【0143】
(1)EOR R0,R0
R0←0。すなわちレジスタR0の値を全ビット0にする。
(2)SL3 R1
レジスタR1の下位3ビット(除数)を上位3ビットに左シフトする。
(3)DIV0S R0,R2
Q←MSB(R2)、M←MSB(R0)=0、T←Q^M=Q^0=Q。 したがって、Tビットには被除数の符号が格納される。
(4)MOVT R3
R3←T。すなわち、被除数の符号をLSB(R3)に格納する。この被除数の符号は余りを求めるときに必要とされる。
(5)SUBC R0,R2
R2←(R2−T)。すなわち、2の補数を1の補数に変換している。換言すれば、被除数が負の場合にR2が保持する被除数から1を引いているのと等価である。この処理において実際には、被除数から被除数の符号ビットMSBの値を差引いていることになるので、被除数が正であるのか負であるを一切検出する必要はなく、何れの場合にも同じ命令を実行して対応できる。すなわち、被除数が負の場合にだけ分岐して1を引く演算を行うような処理フローは不要とされる。
(6)DIV0S R1,R2
Q←MSB(R2)により、被除数の符号をQビットに取得し、
M←MSB(R1)により、除数の符号をMビットに取得し、
T←Q^Mにより、商の符号を取得する。
(7)DIV1 R1,R2
”.arepeat 3”と”.aendr”との間にある命令DIV1 R1,R2が3回繰り返される。
命令DIV1の各実行サイクルにおいて、
Q^M=0のときに減算指令を発行し、Q^M=1のときに加算指令を発行し、
Q←MSB(R2)によりQビットを取得し、R2<<=1によりR2の被除数を1ビット左シフトし、LSB(R2)←TによりR2のLSBにTビット(この時は商の符号になっている)を格納し、
(Q:R2)←(Q:R2)±(M:R1)によって、加減算指令にしたがった演算を行い、
T←〜(Q^M)によって商ビットをTビットに格納する。
命令DIV1を3回実行することにより、Qビットには最後の部分剰余の符号が入っており、Tビットには商の最下位ビットが入っており、R2の上位3ビットには最後の部分剰余が入っており、その下位3ビットには商が入っている。下位から3ビット目には(6)DIVOS R1,R2でTビットに取得した商の符号が入っている。
(8)MOV R2,R4
R2をR4にコピーする。R4を利用して余りを求めるためである。
(9)EXTS.W R2,R2
R2の下位から3ビット目を上位3ビット側に符号拡張する。この符号は商の符号を表している。
(10)ROTCL R2
(R2:T)を左回転、すなわちTビットをレジスタR2のLSBにシフトインしながらレジスタR2の値を左シフトし、シフトアウトされた値のMSBをTビットに格納する。これにより、R2の下位3ビットには商が格納されており、Tビットには商の符号が格納される。
(11)ADDC R0,R2
R2←R2+Tにより、1の補数を2の補数に変換する。すなわち、この命令を実行する直前に商はR2が保持し、Tビットには商の符号が格納されている。したがって、Tビットの値をR2の値に加算することにより、R2が1の補数を保持しているときにはそれが2の補数に変換される。商が正のとき、T=0なので、Tを加算してもR2の値は変化されない。商が負のときはT=1なので、Tを加算することによって、R2の値は1の補数から2の補数に変換される。これによって、正しい商が求められる。
(12)DIV0S R0,R4
Q←MSB(R4)により、R4のMSB(余りの符号)をQビットに格納し、
M←MSB(R0)により、R0(=0)のMSBをMビットに格納し、
T←Q^M=Q^0=Qにより、QビットとMビットの排他的論理和すなわちQビット(余りの符号)を、Tビットに格納して、余りの符号をTビットに得る。
(13)MOVT R0
R0←Tにより、Tビットに保持されている補正前の余りの符号がR0のLSBに格納される。これは余りの補正に用いられる。
(14)EOR R3,R0
R0←R3^R0により、被除数の符号と補正前の余りの符号との排他的論理和の結果がR0のLSBに格納される。
(15)ROTCR R0
(R0:T)の右回転により、TビットをR0のMSBにシフトインしながらR0の値を右シフトし、シフトアウトされた値のLSBをTビットに格納する。これにより、被除数の符号と補正前の余りの符号との排他的論理和の結果がTビットに入る。
(16)BF L1
Tビットの値が0ならばラベルL1に分岐する。T=0のときは被除数と余りの符号が同じなので余りを補正する必要はないからである。
(17)DIV0S R1,R4
Q←MSB(R4)により、Qビットに補正前の余りの符号を格納し、
M←MSB(R1)により、Mビットに除数の符号を格納し、
T←Q^Mにより、QビットとMビットの排他的論理和の結果をTビットに格納する。
(18)ROTCR R4
(R4:T)の右回転により、次のDIV1命令の左シフトを打ち消すための処理を行う。
(19)DIV1 R1,R4
Q^M=0のときに減算指令を発行し、Q^M=1のときに加算指令を発行し、
Q←MSB(R4)によりQビットを取得し、R4<<=1によりR4の値を1ビット左シフトし、LSB(R4)←TによりR4のLSBにTビット(この時は除数の符号と補正前の余りの符号との排他的論理和の結果が入っている)を格納し、
(Q:R4)←(Q:R4)±(M:R1)により、QビットとR4の値を合せた7ビットからMビットとR1の値を合せた7ビットを、前記加減算のための判定結果に従って、加算又減算を行い、その結果をQビットとR4に格納し、
T←〜(Q^M)によってその排他的論理和の結果を反転した値をTビットに格納する。
(20)SR3 R4
R4の上位3ビット(余りに相当)をR4の下位3ビットに右シフトする。
(21)ADD R3,R4
R3は被除数の符号を保持している。R4は補正前の余りを保持している。上記(5)の命令SUBC R0,R2によって被除数からその符号が引かれているので、R4にR3を加算することによって、換言すれば、余りが1の補数であってもこれを2の補数に変換することにより、R4の下位3ビットに正しい余りが得られる。
(22)EXTS.W R4,R4
補正された余りを下位3ビットに保持するR4の上位側を符号拡張して全6ビットで最終的な余りを求める。
【0144】
ここで前記図39及び図40の説明では、3回のDIV1命令の繰返しにおいて、商と余りは共にR2に保持し、DIV1命令の実行毎にR2の値を1ビットづつ左シフトしている(R2<<=1)。この点に関し、従来技術の演算手法のように被除数が負の場合に部分剰余の全ビットが0であるかを判定しなければならないとするなら、R2において判定対象とされる部分剰余の桁位置を毎回変化させてその判定を行わなければならず、その処理は比較的繁雑になる。したがって、従来技術のように被除数が負の場合に部分剰余の全ビットが0であるかを判定しなければならないような演算手法においては、商と余りを別々のレジスタに保持すれば、その様に部分剰余の桁位置を毎回変化させて判定を行わなくてもよくなる。但し、この場合には、商と余りを別々のレジスタに保持させるために実行しなければならない転送命令が逆に増えることになる。本実施例の場合には、部分剰余の全ビットが0であるか否かをその都度判定しなくてもよいから、商と余りを共にR2に保持することによって、実行すべき命令数も減らすことができて、符号付き除算処理の高速化が更に容易になる。
【0145】
尚、図41及び図42には同様に−8÷3、図43及び図44には同様に−9÷−3、図45及び図46には同様に−9÷3、図47及び図48には同様に8÷3、図49及び図50には同様に8÷−3の符号付き除算処理の具体例がそれぞれ示される。これらの内容は前記図39及び図40に対して被除数と除数の値が相違するだけであるから詳細な説明を省略する。
【0146】
〔22〕符号付き除算のための演算ユニット
【0147】
図51には前記符号付き除算を行うことができる演算ユニットの一実施例が示される。この演算ユニットは、図6及び図7に示される汎用レジスタ部GRB及び演算部OPBを、符号付き除算処理を説明し易いように見方を変えて表現したものとして把握することができる。図51において演算ユニットには代表的に5個の汎用レジスタR0〜R4が示される。レジスタR2は被除数または部分剰余を格納するのに利用され、レジスタR1は除数を格納するのに利用される。3は商の符号ビットや商ビットを一時的に格納するための制御ビットレジスタ(第3の制御ビット格納手段)である。この制御ビットレジスタ3を以下単にTビットとも記す。4はシフト制御信号の指令により、前記Tビットを選択回路14を介して最下位ビット或は最上位ビットにシフトインし、最上位ビット或は最下位ビットを選択回路15にシフトアウトするシフタである。また、このシフタはシフト制御信号の指令により32ビット入力の上位16ビットを下位16ビットに論理シフト又は下位16ビットを上位16ビットに論理シフトし、出力する。5は被除数または部分剰余の最上位ビットの上位に付加したビットの役割をするための制御ビットレジスタ(第1の制御ビット格納手段)である。この制御ビットレジスタ5を以下単にQビットとも記す。6は除数の最上位ビットの上位に付加したビットの役割をするための制御ビットレジスタ(第2の制御ビット格納手段)である。この制御ビットレジスタ6を以下単にMビットとも記す。7は算術論理演算回路8に加減算の指示をする演算制御回路である。8は32ビットの算術論理演算回路でる。この算術論理演算回路8は、Aポートの入力に対しBポートの入力を演算制御回路7の指令に従って加減算し、その結果を被除数レジスタR2などにつながるバスに出力することができ、キャリーまたはボローフラグ付き算術論理演算を行う。更にこの算術論理演算回路8は、Bポートの入力のMSB(最上位ビット)をMビットに出力でき、その他に、加算、キャリー付き減算、キャリー付き加算、排他的論理和(EOR)、論理積などの演算を行うことができる。9は制御ビットレジスタ5の値に制御ビットレジスタ6の値を算術論理演算回路8のキャリーまたはボローを含めて加減算する演算回路である。10は演算回路9の結果と制御ビットレジスタとの排他的論理和の否定を計算して、その結果を選択回路12に出力することと、制御ビットレジスタ5の値と制御ビットレジスタ6の値との排他的論理和を計算し、その結果を選択回路12に出力することができる演算回路である。11は制御ビットレジスタ5の入力を選択するものであり、選択回路15を介するシフタ4からの出力と演算回路9からの出力とのどちらかを選ぶための選択回路である。12は算術論理演算回路8のキャリーまたはボロー、演算回路10の演算結果、或は選択回路15の出力の何れかを選択して、制御ビットレジスタ3または演算回路9に出力する選択回路である。13は制御ビットレジスタ5への入力を選択する選択回路11と演算回路9への入力を選択する選択回路13とのどちらかを選択して出力する選択回路である。16は制御レジスタ3の出力を算術論理演算回路8又は選択回路14に供給する選択回路である。17は算術論理演算回路8のBポートに入力が接続された符号拡張回路である。この回路は零拡張も行うことができる。
【0148】
図52には図51に示される算術論理演算回路8、演算回路9、演算回路10、及び演算制御回路7の一例が示される。前記演算制御回路7は、同図の(b)に示されるように2入力型の排他的論理和回路と、その出力と制御信号とを2入力とする排他的論理和回路によって構成される。制御信号が0の時、演算回路10は前者の排他的論理和回路の出力をそのまま出力し、制御信号が1の時演算回路10は前者の排他的論理和回路の出力を否定(反転)して出力する。演算回路10は、図52の(d)に示されるように2入力型の排他的論理和回路と、その出力と制御信号とを2入力とする排他的論理和回路とによって構成される。制御信号が0のとき演算回路10は前者の排他的論理和回路の出力をそのまま出力し、制御信号が1のとき演算回路10は前者の排他的論理和回路の出力を否定(反転)して出力する。図52の(a)において算術論理演算回路8は、加減算のための論理が代表的に示され、32ビットのフルアダーを備える。B00〜B31はBポート入力、A00〜A31はAポート入力、C/Bはキャリ/ボロウであり、SUBは演算制御回路7の出力である。
【0149】
〔23〕符号付き除算に際しての演算ユニットの動作例
【0150】
図53には符号付き除算のための命令列の一例が示される。同図に示される記述は図51に示される回路を用いて32ビット÷16ビットの符号付き除算を行って商と剰余(余り)を求めるためのものである。この除算は、
R2÷R1=R2…R4
によって示されるように、符号付き32ビットの被除数はレジスタR2が保持し、除数は符号付き16ビットとされレジスタR1が保持する。商はレジスタR2が保持し、剰余はレジスタR4が保持する。
【0151】
図54〜図74には図53の命令を順次実行したとき図51の回路の動作が順を追って示され、図75〜図81にはやはり同様にそのときの動作がレジスタの状態を中心に順を追って示される。これらの図面に基づいて、符号付き除算に際して演算ユニットの動作を順次命令単位で説明していく。なお、以下の説明では、前述の通り32ビットデータを16ビットデータで除算するのものとする。被除数および除数は最上位ビットを符号ビットとした2の補数で与えられており、商も2の補数で得るものとする。この説明では、商のオーバーフローの検出は行っていない。被除数が2の補数の負の最小値の場合、処理手順が意図したアルゴリズムと異なるが、この場合は必ずオーバーフローとなるので、商を保証しない。オーバーフローの検出が必要な場合はあらかじめ行っておく。図53の命令列を実行する前提条件として、レジスタR1には16ビット符号付き除数が格納されており、レジスタR2には被除数が格納されている。レジスタR0,R3は作業用レジスタである。商はレジスタR2に格納する。
【0152】
(1)EOR R0,R0
図54及び図75に示されるように、この命令の実行によって作業用レジスタR0の値が0にされる。R0の値が既に0となっている場合はこの命令は必要ない。図54においてシフタ4及び符号拡張回路17は動作されず、入力をスルーで出力する。算術論理演算回路8はAポート入力とBポート入力に対してビット対応で排他的論理和を採る。これによってレジスタR0の値が全ビット0にされる。
【0153】
(2)SL16 R1
図55及び図75に示されるように、この命令の実行によって、除数レジスタR1に格納された除数を16ビット上位にシフト(左シフト)し、下位16ビットに0をシフトインする。16ビット左シフトはシフタ4で行う。算術論理演算回路8はAポート入力をスルーで出力する。
【0154】
(3)DIV0S R0,R2
図56及び図75に示されるように、この命令により、レジスタR2のMSBをQビットに、レジスタR0のMSBをMビットに格納し、QビットとMビットの排他的論理和をTビットに格納する。このとき、レジスタR0の値は0にされているので、TビットにはレジスタR2が保持している被除数のMSBが格納されることになる。この処理において、シフタ4は入力のMSBを選択回路15に与える。符号拡張回路17は入力をスルーで出力する。算術論理演算回路8はBポート入力のMSBを出力する。QビットとMビットの排他的論理和演算は演算回路10が行う。
【0155】
(4)MOVT R3
図57及び図76に示されるように、この命令により、Tビットの値すなわち被除数の符号をレジスタR3に格納する。これは、余りを求めるときのために被除数の符号ビットを保存するためである。この処理において、算術論理演算回路8は、各ビット0の32ビットのビット列にTビットの値を加えて出力する。
【0156】
(5)SUBC R0,R2
図58及び図76に示されるように、この命令により、レジスタR2からレジスタR0をキャリー付で減算する。Tビットがキャリービットである。ここでは、レジスタR0は0なので、レジスタR2からTビット(被除数の符号ビット)を引くことにより2の補数を1の補数に変換している。この処理においてシフタ4及び符号拡張回路17は入力をスルーで出力する。算術論理演算回路8は、Aポート入力からBポート入力とC/B入力とを減算し、その減算結果とC/Bとを出力する。すなわち、SUBC命令で、被除数レジスタであるR2からR0をキャリー付きで減算している。キャリーは制御ビットレジスタ3と同一視している。R0の値は0なので、被除数レジスタであるR2から制御ビットレジスタ3の値を引いたことになる。これで、被除数から被除数の符号ビットの値を引く処理が終了する。この処理により被除数が0以上であった場合は被除数がそのままであるが、被除数が負であった場合には、被除数が1の補数で表現されたことになる。図35には、被除数が負で4ビットの場合に被除数が補正によりどのように表現がかわるかを表わす例を示す。4ビットの符号付き2の補数の最小値”1000”に上記補正を加えると”10111”のように5ビット必要になる。本実施例では被除数は32ビット符号付き2の補数で表現されているので、32ビット符号付き2の補数の最小値に上記補正を加えると33ビット必要になる。制御ビットレジスタ3を最上位ビットとする33ビットで表現することもできるが、本実施例ではそこまで実施していない。なぜならば、被除数が32ビット符号付き2の補数の最小値の場合、必ずオーバーフローが発生し、正しい商が得られないが、オーバーフローが発生する場合をあらかじめ検出して除外すればよいからである。
【0157】
(6)DIV0S R1,R2
図59及び図76に示されるように、この命令により、レジスタR2に格納されている被除数のMSB(符号ビット)をQビットに、レジスタR1に格納されている除数のMSB(符号ビット)をMビットに格納し、QビットとMビットの排他的論理和を採り、これを商の符号としてTビットに格納する。この動作は1つ手前のSUBC R0,R2の実行でオーバーフローしないときに保証される。このとき、シフタ4は32ビット入力のMSBを出力する。符号拡張回路17は入力をスルーで出力する。算術論理演算回路8は、Bポート入力のMSBを出力する。排他的論理和演算は演算回路10が行う。このDIV0S命令により、3つの制御ビットレジスタの初期化が行われる。DIV0S命令の第1オペランドに除数レジスタR1を設定し、第2オペランドに被除数レジスタR2であるR2を設定している。DIV0S命令は第1オペランドを算術論理演算回路8に入力し、第1オペランドのMSBを制御ビットレジスタ6に格納する。その処理と並行してDIV0S命令は第2オペランドのMSBをシフタ4によりシフトアウトし、選択回路15および選択回路11を経由して、制御ビットレジスタ5に格納する。制御ビットレジスタ5と制御ビットレジスタ6の値はDIV0S命令終了後も保持しておく。制御ビットレジスタ5の値は選択回路13を経由して、演算回路10の入力値となる。制御ビットレジスタ6の値は演算回路10の入力値となる。演算回路10は上記2つの入力の排他的論理和を計算し結果を、選択回路12を経由して、制御ビットレジスタ3に格納する。制御ビットレジスタ3の値はDIV0S命令終了後も保持しておく。第1オペランドのR1と第2オペランドのR2は書き替えない。
【0158】
このDIV0S命令は被除数の符号ビットを制御ビットレジスタ5に格納し、除数の符号ビットを制御ビットレジスタ6に格納し、制御ビットレジスタ5と制御ビットレジスタ6の排他的論理和を制御ビットレジスタ3に格納している。制御ビットレジスタ5と制御ビットレジスタ6の値は、次の除算の最初のステップで加算を行うか減算を行うかの判断に用いる。制御ビットレジスタ6は次の除算で除数の符号拡張部として利用する。制御ビットレジスタ3の値は商の符号を表わしている。商が負の場合、商は一度1の補数で求めてから2の補数に変換される。16ビット符号付き2の補数の最小値が商となる場合、1の補数表現では17ビット必要になる。その17ビットの1の補数の符号ビットとなるのが本DIV0S命令終了直後の制御ビットレジスタ3の値である。
【0159】
被除数が32ビット符号付き2の補数の最小値をとる場合、1を引く上記補正により被除数レジスタR2は正の最大値になっているため、DIV0S命令終了直後の制御ビットレジスタ5の値は0となる。本来ならば制御ビットレジスタ5には被除数の符号ビットが入るので、制御ビットレジスタ5の値は1となる筈である。このために、被除数が32ビット符号付き2の補数の最小値をとる場合、制御手順が本来の意図と異なる。しかし、先ほども注意したように、被除数が32ビット符号付き2の補数の最小値をとる場合は商が必ずオーバーフローするが、オーバーフローが発生する場合をあらかじめ検出して除外しておけばよい。以下、被除数が32ビット符号付き2の補数の最小値をとる場合について特別な注意は行わない。
【0160】
(7)DIV1 R1,R2
図53の記述において”.arepeat 16”はアセンブラのマクロ命令で、”.arepeat 16”と”.aendr”との間にある命令を16回展開すると言う意味である。したがって、DIV1命令は16回繰り返され、これによって実質的な除算が行われる。DIV1命令の第1オペランドのR1が除数レジスタ、DIV1命令の第2オペランドのR2が被除数レジスタである。図60及び図77において、1回のDIV1命令の実行は、(i),(ii),(iii),(iv)の処理に大別される。
【0161】
(i)初めに制御ビットレジスタ5と制御ビットレジスタ6の値を演算制御回路7に取り込み、2つの入力の排他的論理和の否定を計算する。この結果は算術論理演算回路8に送られ、算術論理演算回路8はその値を演算指令として保持しておく。上記排他的論理和の結果が1の場合減算指令となり、0の場合加算指令となる。
(ii)次に被除数レジスタR2の値がシフタ4に入力される。シフタ4は入力された32ビットを上位に1ビットシフトする。同時に制御ビットレジスタ3の値をLSBにシフトインし、シフトアウトされたMSBビットを選択回路15を経て選択回路11に送り、制御ビットレジスタ5に格納する。
(iii)次にシフタ4の32ビットの出力の最上位に制御ビットレジスタ5の値を付加した33ビットに対し、除数レジスタR1の最上位に制御ビットレジスタを付加した33ビットを加算または減算する。(i)で加算指令があった場合は加算、(i)で減算指令があった場合は減算を行う。シフタ4の32ビットの出力と除数レジスタR1の値との加減算は算術論理演算回路8で行う。その結果、算術論理演算回路8で生じたキャリーまたはボローを選択回路12を経て演算回路9に送る。算術論理演算回路8で生じた32ビットの演算結果は被除数レジスタR2に格納する。制御ビットレジスタ5と制御ビットレジスタ6との加減算は算術論理演算回路8で先ほど生じたキャリーまたはボロー付きで演算回路9で行う。演算回路9の結果は部分剰余の符号ビットとなる。この部分剰余の符号は一方で選択回路11に送られ制御ビットレジスタ5に格納され、もう一方で、演算回路10の入力値となる。
(iv)演算回路10は、この部分剰余の符号と制御ビットレジスタ6の値との排他的論理和の否定を計算する。その結果は選択回路12に送られ、制御ビットレジスタ3に格納される。この時の制御ビットレジスタ3の値が商ビットとなる。
【0162】
DIV1命令を16回繰り返した直後には、制御ビットレジスタ5には最後の部分剰余の符号が入っており、制御ビットレジスタ3には商の最下位ビットが入っており、被除数レジスタR2の上位16ビットには最後の部分剰余が入っており、下位16ビットには17ビットの商の上位16ビットが入っている。
【0163】
(8)MOV R2,R4
図61に示されるように、この命令により、レジスタR2の上位16ビットに保持されている最後の部分剰余を商を求める手段で破壊しないように、当該レジスタR2の値をレジスタR4に退避する。
【0164】
(9)EXTS.W R2,R2
前記DIV0S命令でTビットに出力した商の符号が、前記DIV1命令を16回繰返すことにより、レジスタR2の下位16ビットの符号ビットの位置にきている。EXTS.W R2,R2は、図62及び図77に示されるように、その下位16ビットの符号ビットを上位16ビットに符号拡張する。この処理において、図62の符号拡張回路17は下位16ビットを32ビットに符号拡張する。算術論理演算回路8は入力をスルーで出力する。すなわち、EXTX.W命令で被除数レジスタR2の下位16ビットの符号を上位16ビットに拡張している。被除数レジスタR2の下位16ビットの符号ビットには前記処理(6)DIVOS R1,R2で求めた商の符号ビットが格納されているので、この商の符号を上位16ビットに拡張している。
【0165】
(10)ROTCL R2
Tビットには前記DIV1命令の16回目で求めた最後の商ビットが入っている。図63及び図78に示されるように、このROTCL命令では、シフタ4を用いて、TビットをレジスタR2のLSBにシフトインすると同時に、レジスタR2の値を左シフトして、シフトアウトされたMSB(符号ビット)をTビットに出力する。すなわち、制御ビットレジスタ3に格納されていた商の最下位ビットを被除数レジスタR2にシフトインする。シフトアウトされた符号ビットは制御ビットレジスタ3に格納される。このとき、被除数レジスタR2には商が格納されている。制御ビットレジスタ3の値が0のとき、つまり、商が正の場合は補正が不要だが、制御ビットレジスタ3の値が1のとき、つまり、商が負の場合は商が1の補数で表現されているので2の補数に変換する必要がある。
【0166】
(11)ADDC R0,R2
この命令を実行する直前にレジスタR2は商を保持し、Tビットには商の符号が格納されている。このADDC命令は、図64及び図78に示されるように、Tビットの値をレジスタR2の値に加算することにより、レジスタR2が保持する1の補数を2の補数に変換する。商が正のとき、T=0なので、Tを加算してもレジスタR2の値は変化しない。商が負のときはT=1なので、Tを加算することによって、レジスタR2の値は1の補数から2の補数に変換される。これによって、正しい商が求められる。この処理において、算術論理演算回路8は、Aポート入力からBポート入力を引き、更に、Tビット(キャリー/ボロー)を引き、ボローをTビットに格納する。すなわち、ADDC命令はキャリー付き加算命令である。制御ビットレジスタ3はキャリーと同一視しており、ADDC命令は被除数レジスタR2に値が0のレジスタR0と制御ビットレジスタ3を加算している。制御ビットレジスタ3の値が0の場合は被除数レジスタR2の値はADDC命令実行前と変わらず、制御ビットレジスタ3の値が1の場合は被除数レジスタR2に格納された商を1の補数から2の補数に変換したことになる。この結果、正しい商を得ることができる。
【0167】
図53において前記命令ADDCの以下に記述された命令DIV0S〜命令EXTS.Wは余りを求めるときに必要な処理とされる。
【0168】
(12)DIV0S R0,R4
この命令は、レジスタR4のMSB(余りの符号)をTビットに格納することを目的とする。すなわち、図65及び図78に示されるように、レジスタR4のMSBがQビットに入り、レジスタR0のMSBがMビットに入り、QビットとMビットの排他的論理和がTビットに入れられる。このとき、前述のように、レジスタR0の値は0であるから、Mビットは0で、TビットにはQビットの値(余りの符号)がそのまま入ることになる。斯る処理において、シフタ4は入力のMSBをQビットに出力する。符号拡張回路17は、入力をスルーで出力する。算術論理演算回路8はBポート入力のMSB(符号ビット)をMビットとして出力する。演算回路10は2入力の排他的論理和を採って出力する。
【0169】
(13)MOVT R0
この命令は、図66及び図79に示されるように、Tビットの値(補正前の余りの符号)をレジスタR0に格納する。斯る処理において、算術論理演算器8は、全ビット0の32ビットのデータにTビットの値を加算してレジスタR0に向けて出力する。
【0170】
(14)EOR R3,R0
この命令は、図67及び図79に示されるようにレジスタR3の内容とレジスタR0の内容に対して排他的論理和を採る。この処理において、シフタ4及び符号拡張回路17は入力をスルーで出力する。算術論理演算回路8は、Aポート入力とBポート入力とに対してビット毎に排他的論理和を採ってレジスタR0に向けて出力する。
【0171】
(15)ROTCR R0
前記命令EORによりレジスタR0のLSBは、被除数の符号と余り(補正前)の符号が異なっているときには1にされ、その符号が一致しているときには0にされている。命令ROTCR R0は、図68及び図79に示されるように、そのようなレジスタR0のLSBをTビットに格納する処理を行う。この処理において、シフタ4はMSBにTビットをシフトインしながらレジスタR0の値を右シフトし、シフトアウトされたLSBをTビットに格納する。算術論理演算器8はAポート入力をスルーで出力する。
【0172】
(16)BF L1
この命令は、Tビットの値が0のときにラベルL1が付いた命令に分岐することを指示し、Tビットの値が1のときにはこのBF命令の次の命令DIV0Sを実行することを指示する。
【0173】
(17)DIV0S R1,R4
この命令は、これに続けて実行される命令ROTCR及び命令DIV1と共に余りの補正を行う。このとき、レジスタR4の上位16ビットには補正前の余りが格納されており、レジスタR1の上位16ビットには除数が格納されている。両者の符号が異なるときは加算、一致するときには減算を行うことになる。このため当該DIV0S命令では、図69及び図80に示されるように、Qビットに余り(補正前)の符号、Mビットに除数の符号を格納し、後記命令DIV1における加減算の判定に供される。TビットにはQビットとMビットの排他的論理和の結果が格納される。この処理において、シフタ4は入力のMSBをQビットに出力する。符号拡張回路17は入力をスルーで出力する。算術論理演算回路8はBポート入力のMSB(符号ビット)を出力する。演算回路10は2入力の排他的論理和を採って出力する。
【0174】
(18)ROTCR R4
後記命令DIV1では左シフトしてから加算又は減算を行うため、この左シフトを打ち消すためにレジスタR4の値を右ローテートしている。この状態は図70及び図80に示される。この処理において、シフタ4はMSBにTビットをシフトインしながらレジスタR4の値を右シフトし、シフトアウトされたLSBをTビットとして格納する。算術論理演算回路8はAポート入力をスルーで出力する。
【0175】
(19)DIV1 R1,R4
この命令DIV1は、図71及び図80に示されるように、(i),(ii),(iii),(iv)の処理に大別される。
【0176】
(i)初めに制御ビットレジスタ5のQビットと制御ビットレジスタ6のMビットを演算制御回路7に取り込み、2つの入力の排他的論理和の否定を計算する。この結果は算術論理演算回路8に送られ、算術論理演算回路8はその値を演算指令として保持しておく。上記排他的論理和の結果が1の場合(補正前の余りの符号と除数の符号が同じ場合)には減算指令とされ、0の場合(補正前の余りの符号と除数の符号が異なる場合)加算指令とされる。
(ii)次にレジスタR4の値がシフタ4に入力される。シフタ4は、レジスタR4の値のLSBにTビットをシフトインしながらレジスタR4の値を1ビット左シフトし、シフトアウトしたMSBをQビットに格納する。
(iii)次に、QビットとレジスタR4の値を合せた33ビットからMビットとレジスタR1の値を合せた33ビットを、前記(i)で取得した判定結果に従って、加算又減算を行い、その結果をQビットとレジスタR4に格納する。シフタ4の出力とレジスタR1の値との加減算は算術論理演算回路8で行う。その結果算術論理演算回路8で生じたキャリーまたはボローを選択回路12を経て演算回路9に送る。演算回路9はそのキャリー/ボローを入力し、これにしたがってQビットとMビットの加減算を行う。
(iv)演算回路10は、前記演算回路9で演算された値すなわちQビットとMビットとの排他的論理和の否定を計算する。この結果は選択回路12を介してTビットに格納される。
【0177】
(20)SR16 R4
この命令は、図72及び図81に示されるように、レジスタR4の上位16ビット(余りに相当)をレジスタR4の下位16ビットに右シフトする。シフト処理はシフタ4が行う。
【0178】
(21)ADD R3,R4
レジスタR3には、前記命令MOVT R3によって被除数の符号が格納されている。前記命令(5)SUBC R0,R2によって被除数からその符号(MSB)が引かれているので、正しい余りを求めるには、レジスタR4に保持されている余りを補正しなければならない場合がある。命令ADD R3,R4では、補正前の余りに被除数の符号(R3)を加えている。この処理は図73及び図81に示されており、シフタ4と符号拡張回路17は夫々入力をスルーで出力する。算術論理演算回路8はAポート入力にBポート入力を加算して、その加算結果とキャリーを出力する。加算結果はレジスタR4に格納され、当該レジスタR4の下位16ビットに正しい余りが保持される。
【0179】
(22)EXTS.W R4,R4
この命令は、図74及び図81に示されるように、下位16ビットに正しい余りが格納されているレジスタR4の上位側を符号拡張して全32ビットの最終的な余りを求める。この処理において、符号拡張回路17は、入力の下位側から第16ビット目の符号を上位16ビットに符号拡張する。算術論理演算回路8はBポート入力をスルーでレジスタR4に向けて出力する。
【0180】
図54〜図74に亘って説明した符号付き除算処理をフローチャートにまとめると、図82の(A)に示される前処理、除算1、及び後処理に大別され、前記除算1の処理は図83の(A)に示されるように除算ステップを16回繰返し実行する。前処理の内容は図82の(B)に示され、除算ステップの処理内容は図83の(B)に示され、後処理の内容は図85に示される。後処理の中では商補正,第1の剰余補正手段,第2の剰余補正手段を行う。商補正の処理は図84の(B)に示され、第1の剰余補正手段は図85の(A)に示され、第2の剰余補正手段は図85の(B)に示される。各フローチャートの内容については更に説明を要さずともその内容は前記説明から容易に理解されよう。
【0181】
図53の命令記述に従った例では、商と余りは同一のレジスタR2に保持したが、双方を別のレジスタに入れるようにしてもよい。例えば商を図示しないレジスタR5に入れるなら、図53の記述において、命令EOR R0,R0の次に命令MOV R0,R5を挿入し、更に、命令DIV1 R1,R2の前に命令ROTCL R5を挿入して当該命令DIV1 R1,R2及び命令ROTCLを16回繰返すようにする。そして、命令EXTS.W R2,R2を命令EXTS.W R5,R5に変更し、次の命令ROTCL R2を命令ROTCL R5に変更し、その次の命令ADDC R0,R2を命令ADDC R0,R5に変更すればよい。
【0182】
なお、図86〜図91には符号付き除算のための命令記述の他の態様例が示される。これらの態様は共に余りに関する補正処理の記述が省略されている。SL8 Rn命令はレジスタRnを8ビット左シフトする命令である。この命令実行後のRn下位8ビットの各ビットは0である。EXTS.B Rn,Rm命令はRnの下位8ビットを32ビットに符号拡張し、Rmに格納する命令である。これらの内容については更に詳細に説明するまでもなくその内容は前記実施例の説明から容易に理解されよう。
【0183】
〔24〕DIVS0/DIV0U/DIV1(ステップ除算)命令
【0184】
ここで、上記説明で使用したDIV0S命令、及びDIV1命令の動作例と使用例について説明する。以下に示す内容は前記項目〔17〕の命令一覧における前提条件を共通にする。その項目に含まれるDIV1命令などとはC言語で表記された動作例においてその細部で相違する。
〔書式〕
DIV1 Rm,Rn
DIVOS Rm,Rn
DIVOU
〔説明〕
汎用レジスタRnの内容32ビットをRmの内容で1ステップ除算し、結果の1ビットをTビットに格納する。DIVOSは符号付き除算用の初期化命令で被除数(Rn)のMSBをQビットに、除数(Rm)のMSBをMビットに、MビットとQビットのEORをTビットに格納する。DIVOUは符号無し除算用の初期化命令で、M/Q/Tビットを0にクリアする。DIV1を(必要であればROTCLと組み合わせて)除数のビット数分繰り返すことによって、商を得る。この繰り返し中は、指定したレジスタとM/Q/Tビットに中間結果を格納している。これらを不必要にソフトウエアで書き替えると、演算結果が保証できなくなる。ゼロ除算とオーバーフローの検出、および剰余の演算は用意していない。除算のシーケンスは下記使用例を参考にできる。
Figure 0003539914
Figure 0003539914
Figure 0003539914
Figure 0003539914
〔使用例1〕R1(32bit)÷R0(16bit)=R1(16bit):符号無し
SL16 R0 ;除数を上位16bit、下位16bitを0に設定
TEST R0,R0 ;ゼロ除算チェックを行う。TEST R0,R0は、R0とR0の論理積が0のときTビットを1とし、1のときTビットを0とする命令である。
BT ZERO_DIV ;T=0のときZERO_DIVに分岐する。
CMP/HS R0,R1 ;オーバーフローチェックを行う。即ち符号無しでR0≦R1のときTビットを1とする。
BT OVER_DIV ;
DIVOU ;フラグの初期化
.arepeat 16 ;
DIV1 R0,R1 ;16回繰り返し
.aendr ;
ROTCL R1 ;
EXTU.W R1,R1 ;R1=商
〔使用例2〕R1:R2(64bit)÷R0(32bit)=R2(32bit):符号無し
TEST R0,R0 ;ゼロ除算チェック
BT ZERO_DIV ;
CMP/HS R0,R1 ;オーバーフローチェック
BT OVER_DIV ;
DIVOU ;フラグの初期化
.arepeat 32 ;
ROTCL R2 ;32回繰り返し
DIV1 R0,R1 ;
.aendr ;
ROTCL R2 ;R2=商
〔使用例3〕R1(16bit)÷R0(16bit)=R1(16bit):符号付き
SL16 R0 ;除数を上位16bit、下位16bitを0に設定
EXTS.W R1,R1 ;被除数は符号拡張して32bit
EOR R2,R2 ;R2=0
DIVOS R2,R1 ;
SUBC R2,R1 ;被除数が負のとき、−1する。
DIVOS R0,R1 ;フラグの初期化
.arepeat 16 ;
DIV1 R0,R1 ;16回繰り返し
.aendr ;
EXTS.W R1,R1 ;R1=商(1の補数表現)
ROTCL R1 ;
ADDC R2,R1 ;商の符号ビットMSBが1のとき、+1して2の補数表現に変換
EXTS.W R1,R1 ;R1=商(2の補数表現)
〔使用例4〕
R2(32bit)÷R0(32bit)=R2(32bit):符号付き
EOR R3,R3 ;
DIVOS R3,R2 ;
SUBC R1,R1 ;被除数は符号拡張して64bit(R1:R2)SUBC R3,R2 ;被除数が負のとき、−1する。
DIVOS R0,R1 ;フラグの初期化
.arepeat 32 ;
ROTCL R2 ;32回繰り返し
DIV1 R0,R1 ;
.aendr ;
ROTCL R2 ;R2=商(1の補数表現)
ADDC R3,R2 ;商の符号ビットMSBが1のとき、+1して2の補数表現に変換
;R2=商(2の補数表現)
【0185】
以上本発明者によってなされた発明を実施例に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【0186】
例えば、データ語長と固定長命令フォーマットのビット数とは、32ビットのデータ語長と16ビット固定長命令フォーマットとに限定されず、夫々2のべき乗のビット数を以て変更することができる。符号付き除算は、32ビット3オペランドRISC用命令などにも適用できる。符号付き除算のための制御はマイクロプログラム方式のほかに、専用の演算回路を構成してワイヤードロジックで制御してもよい。また、符号付き除算において、上記DIV1命令などの専用命令が無い場合には、同様の処理を他の命令によってサブルーチン化して対処することも可能である。
【0187】
以上の説明では主として本発明者によってなされた発明をその背景となった利用分野であるプログラムROMを内蔵するマイクロコンピュータに適用した場合について説明したが本発明はそれに限定されるものではなく、プログラムROMやその多周辺回路を含まないマイクロコンピュータにも広く適用することができる。また、上記実施例では符号付き除算を非回復法に適用した場合について説明したが、回復法にも適用できることはいうまでもない。
【0188】
【発明の効果】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記の通りである。
【0189】
(1)被除数が負の場合、被除数のLSBの重みを持つ1を該被除数から差引く前処理を行うことにより、従来のように部分剰余が0か否かをその都度判定しなくても符号付のままで除算を行うことができるようになる。これにより、除算を高速に実行することができる。換言すれば、従来において部分剰余が0か否かを短いステップ数で判定するための専用的なハードウェアを設けて除算を高速化したのと同様若しくはそれ以上の効果を、ハードウェア量を増大させることなく実現することができる。
(2)部分剰余が0か否かをその都度判定する従来技術で多倍長(任意長)符号付き除算を行う場合には部分剰余のビット数(8ビット、16ビット、32ビット、64ビットなど)に応じて部分剰余=0の判定を行う必要があり、そのビット数に比例してソフトウェア量並びにハードウェア量が増大する。この点において、本発明では部分剰余=0の判定を要しないから、多倍長(任意長)符号付き除算若しくは任意長任意精度符号付き除算においても、ソフトウェア量並びにハードウェア量を増大させることなく容易に対応することができる。
(3)被除数のMSBである符号ビットを引く操作を除算の前処理として採用することにより、被除数が正であるか負であるかを考慮することなく除算プログラムを作成することができ、しかもその様な判定動作を要しないため除算処理が高速化し、その上、被除数が正であるか負であるかにかかわらず同一の回路を利用して除算を行うことができるようになる。
(4)部分剰余に対する除数の引きすぎあるいは足しすぎの判断や商ビット算出を被除数あるいは部分剰余のMSBと除数のMSBのみから行うことができるので、除算のハードウェアが更に簡単になる。また、部分剰余に対する除数の引き過ぎ或は足しすぎの判断や、加減算の判断や、商ビット算出を、被除数あるいは部分剰余のMSBと除数のMSBのみから行うことができるので、この点においても任意長の除算に簡単に応用できる。また、除算ステップにおける加減算の判断、をMSBだけできるので、除算の初期化により同一の除算ステップを符号付きおよび符号無し除算に利用できる。
(5)商と余りをシフトさせながら両者を単一の被除数レジスタに保持していくとき、従来のように部分剰余=0の判定をするときに判定対象とされる部分剰余の桁位置を毎回変化させてその判定を行わなければならないということに基づいてその処理が繁雑になってしかも処理に時間がかかるといった制約を受けず、且つ、商と余りを別々のレジスタに保持させるならばそのために実行しなければならない転送命令が増えるというような制約も受けず、これによって、符号付き除算処理を更に高速化することが容易になる。
【0190】
(6)汎用レジスタ方式を採用するマイクロコンピュータにおいて、命令実行手段に供給される最大のデータ語長よりもビット数の少ない固定長命令フォーマットを採用することにより、従来の32ビットのような固定長命令フォーマットを持つRISCマシンにみられる命令デコード処理の単純化などの利益を享受しつつ、プログラム容量が小さく若しくはプログラムメモリの利用効率が高くしかもシステムコストの小さいマイクロプロセッサを得ることができるという効果がある。
(7)前記固定長命令フォーマット及び前記最大データ語長にそれぞれ2のべき乗のビット数を設定することにより、例えば、最大データ語長が32ビットのとき命令フォーマットを16ビットに固定することにより、メモリ上におけるプログラムのミスアライメントの防止、並びに市販されている一般的なメモリなどとの整合性を保ち、且つ、同一ビット構成のROM/RAM上に命令及びデータどちらでも展開することができるという効果を得る。
(8)前記固定長命令フォーマット及び前記最大データ語長にそれぞれ2のべき乗のビット数を設定するとき、バス幅全体を使って複数命令を同一サイクルでプリフェッチすることにより、最大データ語長に等しいビット数の内部バスを利用して能率的に命令をフェッチすることができると共に命令フェッチのためのバスアクセス回数を減らすことができる。
(9)内部バスがデータ転送と命令フェッチに共用される場合、メモリに対するデータフェッチと命令フェッチが競合したとき、データフェッチを優先し、このデータフェッチに競合する命令フェッチを含む命令実行スケジュールを全体的に遅延させるパイプ制御を行うようにすることにより、データフェッチと命令フェッチが競合したときの処理若しくはそれに起因する後処理を簡単化することができるという効果がある。
(10)特定のレジスタの値に対してディスプレースメントの値をオフセットとするレジスタ相対でイミディエートデータを指定させる記述を含む命令をサポートすることにより、固定長命令フォーマットのビット数の制限がイミディエートデータの利用に制限を与えないようにすることができるという効果がある。
(11)命令中にレジスタ指定フィールドがないのにも拘らずオペランドとして固定された特定の汎用レジスタを暗黙的に指定させる命令をサポートすることにより、ビット数が制限された固定長命令フォーマットであっても処理上必要なディスプレースメント若しくはイミディエートデータのビット数を極力多くすることができるという効果がある。
(12)指定条件に対する演算結果の真偽を所定の状態フラグに反映させる記述を含む命令をサポートすることにより、ビット数が制限された固定長命令フォーマットであっても、処理上必要なディスプレースメント若しくはイミディエートデータのビット数を極力多くすることができるという効果がある。
(13)これらの効果により、固定長命令フォーマットのビット数がデータ語長より少なくてもイミディエートデータの利用や絶対アドレス指定に制限を及ぼさないこと、限られたビット数の固定長命令フォーマットの中で必要なディスプレースメントなどの記述が可能であること、メモリ上におけるプログラム配置のミスアライメントの防止に寄与すること、並びにサポートする命令の内容という点からコード効率もしくはメモリ利用効率を一層向上させることなど、データ語長よりも少ないビット数の固定長命令フォーマットを採用することに付随する種々の問題点の解決を実現することができる。
(14)汎用レジスタに含まれるレジスタ競合状態を命令フォーマット中に含まれるレジスタ指定領域の情報に基づいて検出し、この検出結果と命令実行サイクル数に基づいて相対的に後の命令の実行を遅延させるパイプ制御手段とを採用することにより、汎用レジスタ方式を利用してパイプライン的に実行される前後の命令による前記汎用レジスタの利用が競合する状態に簡単に対処することができる。
(15)16ビット固定長命令フォーマットのとき、条件分岐命令のディスプレースメントを8ビットに固定し、サブルーチン分岐命令及び無条件分岐命令のディスプレースメントを12ビットに固定することにより、命令フォーマット長が制限された中で実際の動作に実質的な悪影響を与えることなく分岐命令の種類に応じた適切な分岐先を指定することができる。
【図面の簡単な説明】
【図1】実施例に係るマイクロコンピュータMCUを利用したシステムの一例ブロック図である。
【図2】実施例に係るマイクロコンピュータのブロック図である。
【図3】実施例に係るマイクロコンピュータのパッケージに対するピン配置の概念的な説明図である。
【図4】実施例に係るマイクロコンピュータにおけるバス幅に対するデータ語長と命令語長との一例関係説明図である。
【図5】実施例に係るマイクロコンピュータに含まれる中央処理装置の内部ブロック、特にその命令制御系の一例を示すブロック図である。
【図6】中央処理装置の実行ユニットの半部の構成を示すブロック図である。
【図7】中央処理装置の実行ユニットの残り半分の構成を示すブロック図である。
【図8】中央処理装置によるパイプライン処理のステージの一例説明図である。
【図9】レジスタ競合状態におけるパイプラインシーケンスの一例説明図である。
【図10】レジスタ競合状態におけるパイプラインシーケンスの別の例を示す説明図である。
【図11】データフェッチと命令フェッチが競合した場合のパイプ制御シーケンスの一例説明図である。
【図12】複数サイクル命令を実行するときの一例動作タイミングチャートである。
【図13】実施例に係るマイクロコンピュータで実行されるデータ転送命令の半分を示す一覧説明図である。
【図14】実施例に係るマイクロコンピュータで実行されるデータ転送命令の残りの半分を示す一覧説明図である。
【図15】実施例に係るマイクロコンピュータが実行する論理演算命令の一覧説明図である。
【図16】実施例に係るマイクロコンピュータが実行する算術演算命令の半分の一覧説明図である。
【図17】実施例に係るマイクロコンピュータが実行する算術演算命令の残り半分の一覧説明図である。
【図18】実施例に係るマイクロコンピュータが実行する命令の一覧説明図である。
【図19】実施例に係るマイクロコンピュータが実行する分岐命令の一覧説明図である。
【図20】実施例に係るマイクロコンピュータが実行するシステム制御命令の半分の一覧説明図である。
【図21】実施例に係るマイクロコンピュータが実行するシステム制御命令の残り半分の一覧説明図である。
【図22】図13乃至図21の記載形式の説明図である。
【図23】図13乃至図21に記載のニモニック表示中におけるアドレシングモードの一覧説明図である。
【図24】ブランチ命令のディスプレースメント長とそのディスプレースメント長を有する命令の出現頻度との関係を示す一例説明図である。
【図25】ブランチオールウエイズ命令のディスプレースメント長とそのディスプレースメント長を有する命令の出現頻度との関係を示す一例説明図である。
【図26】サブルーチン呼び出し命令のディスプレースメント長とそのディスプレースメント長を有する命令の出現頻度との関係を示す一例説明図である。
【図27】ジャンプ命令若しくはジャンプサブルーチン命令のディスプレースメント長とそのディスプレースメント長を有する命令の出現頻度との関係を示す一例説明図である。
【図28】プログラマーズモデルとしての一例レジスタ構成説明図である。
【図29】本発明に係る符号付き除算における被除数に対する前処理の原理を示す概念図である。
【図30】負÷負の場合における符号付き除算処理の原理的な一例説明図である。
【図31】負÷正の場合における符号付き除算処理の原理的な一例説明図である。
【図32】正÷正の場合における符号付き除算処理の原理的な一例説明図である。
【図33】本発明に係る符号付き除算の基本的な約束ごと若しくは基本的な処理手順の全体を一般的形式で示す説明図である。
【図34】被除数の前補正のやり方について(A)に示し、商の符号予測について(B)に示した説明図である。
【図35】負の被除数に対する前補正の一例説明図である。
【図36】負の被除数に対する1を差し引く前補正後の部分剰余の表現例を示す説明図である。
【図37】符号付き除算過程における加減算指令の出しかたについての一例を(A)に示し、商ビットの出しかたについての一例を(B)に示した説明図である。
【図38】商と剰余に対する補正のしかたについての一例説明図である。
【図39】−8÷−3の符号付き除算における前補正と除算処理の具体的な処理手順説明図である。
【図40】図39の処理に継続される後処理の具体的な処理手順説明図である。
【図41】−8÷3の符号付き除算における前補正と除算処理の具体的な処理手順説明図である。
【図42】図41の処理に継続される後処理の具体的な処理手順説明図である。
【図43】−9÷−3の符号付き除算における前補正と除算処理の具体的な処理手順説明図である。
【図44】図43の処理に継続される後処理の具体的な処理手順説明図である。
【図45】−9÷3の符号付き除算における前補正と除算処理の具体的な処理手順説明図である。
【図46】図45の処理に継続される後処理の具体的な処理手順説明図である。
【図47】8÷3の符号付き除算における前補正と除算処理の具体的な処理手順説明図である。
【図48】図47の処理に継続される後処理の具体的な処理手順説明図である。
【図49】8÷−3の符号付き除算における前補正と除算処理の具体的な処理手順説明図である。
【図50】図49の処理に継続される後処理の具体的な処理手順説明図である。
【図51】符号付き除算を行うための演算ユニットの一実施例ブロック図である。
【図52】図51に示される算術論理演算回路、演算回路、及び演算制御回路の一例論理回路図である。
【図53】符号付き除算のための命令記述の詳細な一例説明図である。
【図54】図53の命令EOR R0,R0を実行するときにおける図51の回路の動作説明図である。
【図55】図53の命令SL16 R1を実行するときにおける図51の回路の動作説明図である。
【図56】図53の命令DIV0S R0,R2を実行するときにおける図51の回路の動作説明図である。
【図57】図53の命令MOVT R3を実行するときにおける図51の回路の動作説明図である。
【図58】図53の命令SUBC R0,R2を実行するときにおける図51の回路の動作説明図である。
【図59】図53の命令DIV0S R1,R2を実行するときにおける図51の回路の動作説明図である。
【図60】図53の命令DIV1 R1,R2を実行するときにおける図51の回路の動作説明図である。
【図61】図53の命令MOV R2,R4を実行するときにおける図51の回路の動作説明図である。
【図62】図53の命令EXTS.W R2,R2を実行するときにおける図51の回路の動作説明図である。
【図63】図53の命令ROTCL R2を実行するときにおける図51の回路の動作説明図である。
【図64】図53の命令ADDC R0,R2を実行するときにおける図51の回路の動作説明図である。
【図65】図53の命令DIV0S R0,R4を実行するときにおける図51の回路の動作説明図である。
【図66】図53の命令MOVT R0を実行するときにおける図51の回路の動作説明図である。
【図67】図53の命令EOR R3,R0を実行するときにおける図51の回路の動作説明図である。
【図68】図53の命令ROTCR R0を実行するときにおける図51の回路の動作説明図である。
【図69】図53の命令DIV0S R1,R4を実行するときにおける図51の回路の動作説明図である。
【図70】図53の命令ROTCR R4を実行するときにおける図51の回路の動作説明図である。
【図71】図53の命令DIV1 R1,R4を実行するときにおける図51の回路の動作説明図である。
【図72】図53の命令SR16 R4を実行するときにおける図51の回路の動作説明図である。
【図73】図53の命令ADD R3,R4を実行するときにおける図51の回路の動作説明図である。
【図74】図53の命令EXTS.W R4,R4を実行するときにおける図51の回路の動作説明図である。
【図75】図54の動作に対応するレジスタの状態を(A)に示し、図55の動作に対応するレジスタの状態を(B)に示し、図56の動作に対応するレジスタの状態を(C)に示した説明図である。
【図76】図57の動作に対応するレジスタの状態を(D)に示し、図58の動作に対応するレジスタの状態を(E)に示し、図59の動作に対応するレジスタの状態を(F)に示した説明図である。
【図77】図60の動作に対応するレジスタの状態を(G)に示し、図62の動作に対応するレジスタの状態を(H)に示した説明図である。
【図78】図63の動作に対応するレジスタの状態を(I)に示し、図64の動作に対応するレジスタの状態を(J)に示し、図65の動作に対応するレジスタの状態を(K)に示した説明図である。
【図79】図66の動作に対応するレジスタの状態を(L)に示し、図67の動作に対応するレジスタの状態を(M)に示し、図68の動作に対応するレジスタの状態を(N)に示した説明図である。
【図80】図69の動作に対応するレジスタの状態を(O)に示し、図70の動作に対応するレジスタの状態を(P)に示し、図71の動作に対応するレジスタの状態を(Q)に示した説明図である。
【図81】図72の動作に対応するレジスタの状態を(R)に示し、図73の動作に対応するレジスタの状態を(S)に示し、図74の動作に対応するレジスタの状態を(T)に示した説明図である。
【図82】図54〜図74に亘って説明した符号付き除算処理の全体を(A)に示し、前処理を(B)に示したフローチャートである。
【図83】図82の除算1の処理を(A)に示し、除算ステップの処理を(B)に示したフローチャートである。
【図84】図82の後処理を纏めて(A)に示し、商補正の処理を(B)に示したフローチャートである。
【図85】図84の後処理の詳細である第1の剰余補正手段の処理を(A)に示し、第2の剰余補正手段の処理を(B)に示したフローチャートである。
【図86】8ビット÷8ビットの符号付き除算のための命令記述の一例説明図である。
【図87】64ビット÷32ビットの符号付き除算のための命令記述の一例説明図である。
【図88】32ビット÷32ビットの符号付き除算のための命令記述の一例説明図である。
【図89】16ビット÷16ビットの符号付き除算のための命令記述の一例説明図である。
【図90】16ビット÷8ビットの符号付き除算のための命令記述一例説明図である。
【図91】32ビット÷16ビットの符号付き除算のための命令記述の一例説明図である。
【図92】ローテート命令(ROTL/ROTR)による処理の説明図である。
【図93】キャリービット付きローテート命令(ROTCL/ROTCR)による処理の説明図である。
【図94】算術シフト命令(SHAL/SHAR)による処理の説明図である。
【図95】論理シフト命令(SHLL/SHLR)による処理の説明図である。
【図96】マルチビットシフト命令(SLn/SRn)による処理の説明図である。
【図97】切り出し命令(XTRCT)による処理の説明図である。
【符号の説明】
MCU マイクロコンピュータ
CPU 中央処理装置
IAB23−0 内部アドレスバス
IDB31−0 内部データバス
IRH,IRL 命令バッファ
MPX マルチプレクサ
IR1 インストラクションレジスタ
IR2 インストラクションレジスタ
IF&IRC 命令フェッチ/命令レジスタ制御ブロック
HSC−ROM 高速制御リードオンリメモリ
FO&PCD フラグ操作及びパイプ制御デコーダ
SR ステータスレジスタ
T トゥルービット
HIR ハードウェア・シーケンス・コントロール・インストラクション・レジスタ
ID インストラクションデコーダ
SRD ソースレジスタデコーダ
DRD ディスティネーションレジスタデコーダ
WBRD ライトバックレジスタデコーダ
WBR0,WBR1 一時ラッチ
RCCB レジスタコンテントチェックブロック
EXEC 命令実行ユニット
R0H,R0L〜R15H,R15L 汎用レジスタ
R0 ワークレジスタ
R1 除数レジスタ
R2 被除数レジスタ
R4 剰余レジスタ
R3 汎用レジスタ(第4の制御ビット格納手段)
3 Tビット(第3の制御ビット格納手段)
4 シフタ
5 Qビット(第1の制御ビット格納手段)
6 Mビット(第2の制御ビット格納手段)
7 演算制御回路
8 算術論理演算回路
9 演算回路
10 演算回路
11 選択回路
12 選択回路
13 選択回路
14 選択回路
15 選択回路
16 選択回路
17 符号拡張回路

Claims (9)

  1. 1つの半導体チップに形成され、
    32ビット長の命令レジスタと、
    32ビット長のデータの転送が可能なデータバスと、
    前記データバスに結合され、32ビット長のデータを格納可能な複数の汎用レジスタとを有し、
    16ビット固定長命令セットの命令が実行可能なマイクロコンピュータ。
  2. 上記命令レジスタは、2つの16ビット長の命令をフェッチする請求項記載のマイクロコンピュータ。
  3. 更に、上記命令レジスタの上記16ビット長の命令をデコードする命令デコーダを有する請求項記載のマイクロコンピュータ。
  4. 更に、プログラムカウンタを有し、
    上記16ビット長の命令には、上記プログラムカウンタ内の第1のアドレスに加算して第2のアドレスを示すためのディスプレースメントを有する命令が含まれる請求項記載のマイクロコンピュータ。
  5. 上記プログラムカウンタは、上記命令レジスタにフェッチされた命令のアドレスを格納する請求項記載のマイクロコンピュータ。
  6. 前記データバスに結合され、前記16ビット固定長命令セットの命令が格納される命令メモリを有する請求項1記載のマイクロコンピュータ。
  7. 前記データバスに結合されたキャッシュメモリを有する請求項1記載のマイクロコンピュータ。
  8. 前記データバスに結合されたダイレクトメモリアクセスコントローラを有する請求項1記載のマイクロコンピュータ。
  9. 前記データバスに結合されたランダムアクセスメモリを有する請求項1記載のマイクロコンピュータ。
JP2000212452A 1991-06-24 2000-07-13 マイクロコンピュータ Expired - Lifetime JP3539914B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2000212452A JP3539914B2 (ja) 1991-06-24 2000-07-13 マイクロコンピュータ

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP3-178739 1991-06-24
JP17873991 1991-06-24
JP2000212452A JP3539914B2 (ja) 1991-06-24 2000-07-13 マイクロコンピュータ

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP10158143A Division JP3105197B2 (ja) 1991-06-24 1998-06-05 除算回路及び除算方法

Publications (2)

Publication Number Publication Date
JP2001067219A JP2001067219A (ja) 2001-03-16
JP3539914B2 true JP3539914B2 (ja) 2004-07-07

Family

ID=26498833

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000212452A Expired - Lifetime JP3539914B2 (ja) 1991-06-24 2000-07-13 マイクロコンピュータ

Country Status (1)

Country Link
JP (1) JP3539914B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015049832A (ja) 2013-09-04 2015-03-16 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation 定数ロードのオーバーヘッドを削減する方法、装置及びプログラム

Also Published As

Publication number Publication date
JP2001067219A (ja) 2001-03-16

Similar Documents

Publication Publication Date Title
JP2984463B2 (ja) マイクロコンピュータ
US5901301A (en) Data processor and method of processing data
EP1126368B1 (en) Microprocessor with non-aligned circular addressing
US6560697B2 (en) Data processor having repeat instruction processing using executed instruction number counter
JP3745039B2 (ja) 遅延命令を有するマイクロプロセッサ
US20110191569A1 (en) Data processing device and semiconductor integrated circuit device
US5924114A (en) Circular buffer with two different step sizes
JP4073721B2 (ja) データ処理装置
JP3105197B2 (ja) 除算回路及び除算方法
JP3539914B2 (ja) マイクロコンピュータ
JP3215085B2 (ja) 中央処理装置及びマイクロコンピュータ
JP3205544B2 (ja) 中央処理装置
JP2646855B2 (ja) データ処理装置
JP3740321B2 (ja) データ処理装置
JP2522048B2 (ja) マイクロプロセッサ及びそれを使用したデ―タ処理装置
JP4382076B2 (ja) データ処理装置
JP2009134745A (ja) データ処理装置

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20031224

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040220

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20040316

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040323

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313117

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20080402

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090402

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090402

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100402

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100402

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130402

Year of fee payment: 9

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130402

Year of fee payment: 9

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313111

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130402

Year of fee payment: 9

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

EXPY Cancellation because of completion of term
FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130402

Year of fee payment: 9