図1は、本発明の実施例1に係る浮動小数点加算器の構成を示す図である。図1に示す浮動小数点加算器は、符号・指数処理部10、第1のセレクタ11、第2のセレクタ12、補数化回路13、アラインメント部14、比較器15、絶対値加算器16、正規化処理部17を有する。
図1の符号・指数処理部10は、浮動小数点演算の対象となる2つのオペランドの符号及び指数についての演算処理を行う。符号・指数処理部10では、2つのオペランドOPERAND AおよびOPERAND Bの符号から、加算と減算とのいずれの演算を行うかを示す“ADD/SUB”信号を出力する。“ADD/SUB”信号は、補数化回路13や絶対値加算器16で使用される。
符号・指数処理部10はまた、指数の大小比較結果から得られる、オペランド交換するかどうかを示すEX_OP信号や、指数EAとEBが等しくないことを示すEA_NE_EB信号を出力する。ここで、EX_OP信号は、オペランドAの仮数部とオペランドBの仮数部のいずれを選択するかの制御信号として使用される。また、EA_NE_EB信号はオペランドAの指数EAとオペランドBの指数EBが等しくないときに1となる信号である。
第1のセレクタ11及び第2のセレクタ12は、それぞれオペランドの指数の大小比較結果に基づいて2つのオペランドの仮数の一方を選択し、仮数FOPA及びFOPBを出力する。具体的には、指数の大きい方のオペランドの仮数をセレクタ11で選択して仮数FOPAとして補数化回路13へ出力し、他方のオペランドの仮数をセレクタ12で選択して仮数FOPBとしてアラインメント部14へ出力する。尚、2つのオペランドの指数が等しい場合、セレクタ11はオペランドAの仮数部とオペランドBの仮数部のいずれを選択することもできる。この場合、セレクタ12はセレクタ11で選択されていないオペランドの仮数部を選択する。
補数化回路13は、第1のセレクタ11で選択された仮数FOPAに対して、“ADD/SUB”信号が加算を示す場合にはFOPAをそのまま出力し、“ADD/SUB”信号が減算を示す場合にはFOPAに対して1の補数をとった値を出力する。補数化回路13の出力は、絶対値加算器16に入力する。
アラインメント部14は、後述の符号・指数処理部10で判定される2つのオペランドの指数差(図1では“PA_SFT”)の分だけ、第2のセレクタ12で選択された仮数FOPBのシフトを行うことにより桁合わせ処理を行う。その際、シフトされた仮数の最下位のビットの下に、いわゆるガードビット、ラウンドビット、及びラウンドビットより下位の位置に一つでも“1”があるかどうかを示すスティッキービットを付加するようにしても良い。アラインメント部14の出力は、絶対値加算器16に入力する。
比較器15は、第1のセレクタ11及び第2のセレクタ12で選択された仮数(FOPA,FOPB)を比較し、2つのオペランドの指数の値が等しい時の絶対値加算器16による減算の結果が正負いずれになるかを判定する。2つのオペランドの指数が異なる場合、前述の通り指数が大きいオペランドの仮数FOPAを補数化回路13を通して絶対値加算器16に入力するので、比較器15で仮数の比較をしなくても、絶対値加算器16による減算の結果が負の値となることが分かる。
論理ゲート18は、比較器15の判定結果であるF_GTと、2つのオペランドの指数が等しくないことを示すEA_NE_EB信号との論理演算を行なうことにより、減算時の絶対値加算器16の加算結果が正負いずれの値になるかを示す“POSI/NEG”信号を出力する。
絶対値加算器16は、“ADD/SUB”信号及び“POSI/NEG”信号を用いて絶対値加算器16における再補数化の制御及びキャリー入力の制御を行いつつ、補数化回路13及びアラインメント部14から出力される信号に対する絶対値加算を行う。
正規化処理部17は、絶対値加算器16の出力結果に対して、正規化と丸め操作を行う。
符号・指数処理部10から出力される浮動小数点加算器の加算結果としての符合及び指数、ならびに正規化処理部17から出力される浮動小数点加算器の加算結果としての仮数を合わせて、最終的な浮動小数点加算器の加算結果(F_RESULT)が生成される。
図2では、減算が行なわれる場合、符号・指数処理部10からは、減算を示すSUB信号が出力される例を示す。図2ではまた、論理ゲート18を論理和ゲートとし、オペランドの減算時に絶対値加算器16の加算結果が負となると判別された場合に、NEG信号を出力する。以下の説明では、主として図2に示す実施例を用いて本願実施形態における絶対値加算器の説明を行う。
実施例1に係る浮動小数点加算器1は、桁合わせを行うアラインメント部14の動作と並行して仮数FOPAと仮数FOPBの比較を行う比較器15を設けることを特徴とする。実施例1の比較器15は、指数の大小によって経路を確定した後のオペランドAの仮数FOPA及びオペランドBの仮数FOPBを比較し、FOPA>FOPBが成立する時に出力信号F_GTを1にする。ここで、FOPA≧FOPBが成立する時に比較器15から出力される信号を1にしても良い。
前述の通り、補数化回路13にはオペランドの指数が大きい方のオペランドの仮数部が入力されるので、オペランドの指数が等しくないときは、減算時における絶対値加算器16の加算結果は負の値になる。また、オペランドの指数が等しいときは、オペランドAの仮数がオペランドBの仮数よりも大きい場合に、減算時における絶対値加算器16の加算結果は負の値になる。従って、論理和ゲート18により、比較器15から出力されるF_GT信号とEA_NE_EB信号との論理和をとることにより、NEG信号を生成することができる。このNEG信号は絶対値加算器16に通知され、絶対値加算器16における再補数化の制御及びキャリー入力の制御に用いられる。
図3は、図2における符号・指数処理部10の一例を示す図である。符号・指数処理部10は、指数値の大小を判定し、オペランド間の指数差(pre alignment shift amount)を絶対値として求める。指数値の大小判定は、高速化のために、入力された各オペランドの指数EXPA及びEXPBについて(EXPA−EXPB)と(EXPB−EXPA)を同時に計算し、(EXPA−EXPB)又は(EXPB−EXPA)のキャリー出力を用いて判定する。
具体的には、図3に示す加算器101のA端子にはEXPAがそのまま入力され、加算器101のB端子には、1の補数化器103でEXPBを反転させた信号が入力される。加算器101のキャリー入力を1にすれば、加算器101において(EXPA−EXPB)が計算される。同様に、加算器102のA端子には、1の補数化器104でEXPAを反転させた信号が入力され、加算器102のB端子には、EXPBがそのまま入力される。加算器102のキャリー入力を1にすれば、加算器102において(EXPB−EXPA)が計算される。
セレクタ105は、加算器101のキャリー出力(carry out)の値が1の場合には加算器101の加算結果を、加算器101のキャリー出力の値が0の場合には加算器102の加算結果を選択し、指数差(pre alignment shift amount)として出力する。この指数差は図1・図2で“PA_SFT”として図示しているものであり、図1・図2におけるアラインメント部14において指数差の分だけ桁あわせシフトが行われる。
符号・指数処理部10はまた、加算器101と加算器102との両方のキャリー出力の結果から、各オペランドの指数の大小を判定し、3つの制御信号EXPA_GT_EXPB、EXPB_GT_EXPA、EXPA_EQ_EXPBを生成する。具体的には、インバータ106は、加算器101のキャリー出力を反転することにより、EXPBがEXPAよりも大きいことを示すEXPB_GT_EXPA信号を生成する。インバータ108は、加算器102のキャリー出力を反転することにより、EXPAがEXPBよりも大きいことを示すEXPA_GT_EXPB信号を生成する。また、ANDゲート107は、加算器101のキャリー出力と加算器102のキャリー出力の論理積をとることにより、EXPAとEXPBが等しいことを示すEXPA_EQ_EXPB信号を生成する。これら3つの制御信号EXPA_GT_EXPB、EXPB_GT_EXPA、EXPA_EQ_EXPBを用いて、図1・図2におけるEX_OP信号やEA_NE_EB信号が生成される。
例えば、オペランドBの指数EXPBがオペランドAの指数EXPAよりも大きい場合は、オペランドAの仮数の換わりにオペランドBの仮数を補数化回路13に入力し、オペランドAの仮数をアラインメント部14へ入力する。そのため、オペランド交換するかどうかを示すEX_OP信号としてはEXPB_GT_EXPAをそのまま用いることができる。セレクタ11は、EX_OP信号が0の時にオペランドAの仮数を、EX_OP信号が1の時にオペランドBの仮数を選択してFOPAを出力する。セレクタ12は、EX_OP信号が0の時にオペランドBの仮数を、EX_OP信号が1の時にオペランドAの仮数を選択してFOPBを出力する。
また、図1・図2におけるEA_NE_EB信号としては、EXPA_EQ_EXPBの論理反転をとった信号、あるいはEXPB_GT_EXPAとEXPA_GT_EXPBとの論理和をとった信号等を用いることができる。
指数と符号については、セレクタ101及びセレクタ102は、(EXPA−EXPB)又は(EXPB−EXPA)のキャリー出力を用いて指数値の大きいオペランドの指数と符号を選択する。
具体的には、セレクタ110は、加算器101のキャリー出力(carry out)の値が1の場合には入力した指数EXPAを、加算器101のキャリー出力の値が0の場合には入力した指数EXPBを選択する。選択された指数は、EXP_BEFORE_NORMALIZEとして、正規化処理部17に対してシフト可能な最大値として通知(図1・図2では対応する信号不図示)される。
セレクタ110で選択された指数は、オペランド加算時の1ビット桁あふれした状態を基準位置とするために、+1操作部111で+1操作を行うことで、正規化シフタを片方向シフトのみとしてインプリメントする。
+1操作部111で+1操作した指数に対して、正規化処理部17における正規化操作によってシフトした値分を減じる補正操作が減算器112において行われる。ここで、図3における“leading zero result as normalize shift amount”は、後述する正規化処理部17のリーディングゼロカウント部161が出力するリーディングゼロカウント値LZCに相当する信号である。
また、後述の正規化処理部17における丸め操作により桁上がりが生じた場合には、減算器112から出力される指数に対して+1操作をする必要がある。+1操作部113は、減算器112から出力される指数に対して+1操作を行なう。セレクタ114は、“round carry out”が1の場合には+1操作部113の出力を選択し、“round carry out”が0の場合には減算器112の出力を選択して、浮動小数点加算器の加算結果の指数(result_exp)として出力する。ここで、“round carry out”は、後述の正規化処理部17の丸め加算器164から出力されるキャリー出力信号である。
入力データ、つまり各オペランドの符号signAと符号signBの値が異なる場合には、排他的論理和ゲート120でこれらの符号の排他的論理和をとることにより、減算であることを示すSUB信号を生成する。
セレクタ121は、加算器101のキャリー出力(carry out)の値が1の場合にはsignAを、加算器101のキャリー出力が0の場合にはsignBを選択する。
オペランドの減算時であって、オペランドの指数が等しい場合に絶対値加算器の演算結果を再補数化した場合には、セレクタ121から出力される符号を反転させる必要がある。論理ゲート122は、セレクタ121から出力される符号を反転させるか否かを制御する信号を生成する。すなわち、論理ゲート122は、EORゲートから出力されるSUB信号、ANDゲート107から出力されるEXPA_EQ_EXPB信号、比較器15で生成されたF_EQに相当するFA_EQ_FB(又は、FOPA_EQ_FOPB)信号の反転信号、及び絶対値加算器16で生成されるRECOMP信号の論理積を生成する。EORゲート123は、セレクタ121から出力される信号と論理ゲート122の出力信号との排他的論理和を生成し、絶対値加算器の加算結果の符合(result sign)として出力する。
図4は、図2における比較器15の一例を示す図である。図4に示す比較器は、IEEE754の倍精度演算まで対応できるように、52ビット長の比較器としたものである。IEEE754の倍精度フォーマットでは、仮数部は53ビットの精度をもっているが、正規化してMSBビットを隠れビット化している。このため、指数値が同じ場合には、MSBビットは同じ値になる。仮数部の大小を判定する上では、MSBビットを無視しても比較結果に影響を与えないため、本実施形態においては、データ比較器は最低52ビット分の比較ができれば十分である。
図4に示す比較器は、3つの16ビット・ブロック130、131、132と、4ビット・ブロック133、及び各ブロックからの出力信号をまとめるブロック134とを有する。
16ビット・ブロック130は、4つの4ビット・ブロック130−1〜130−4及びこれらの各4ビット・ブロックからの出力結果をまとめるブロック130−5を有する。なお、他の16ビットブロック131及び132についても、16ビットブロック130と同様の構成となるので、説明を省略する。
4ビット・ブロック130−1は、入力データA[3:0]及び入力データB[3:0]を比較し、A[3:0]とB[3:0]が一致することを示すEQ又はA[3:0]がB[3:0]よりも大きいことを示すGTを出力する。具体的には、ANDゲート130−112は、A[3:0]とB[3:0]の各ビットの排他的論理和の反転信号の論理積をとることにより、EQ信号を出力する。ORゲート130−111は、A[3:0]がB[3:0]よりも大きい場合のデコード信号の論理和をとることにより、GT信号を出力する。
他の4ビット・ブロック130−2〜130−4及び133の構成も4ビット・ブロック130−1と同様の構成となるので、説明を省略する。
各4ビット・ブロックの出力信号を受けるブロック130−5や、各16ビット・ブロックの出力信号を受けるブロック134は、4ビット・ブロック130−1の中のブロック130−11と同様の論理で構成できる。
ブロック130−5では、各4ビット・ブロック130−1〜130−4から出力されるGT信号及びEQ信号に基づいて、入力信号A[15:0]とB[15:0]の比較を行なう。ANDゲート130−52は、A[15:0]とB[15:0]の比較結果が一致していれば、出力信号のEQを1にする。ORゲート130−51は、A[15:0]がB[15:0]よりも大きければ、出力信号のGTを1にする。
ブロック134では、各ブロック130〜133から出力されるGT信号及びEQ信号に基づいて、入力信号A[51:0]とB[51:0]の比較を行う。そして、ブロック134は、その比較結果が一致していれば、ANDゲート134−2の出力信号F_EQを1としてA=Bであることを示す。一方、ブロック134は、A[51:0]がB[51:0]よりも大きければ、ORゲート134−1の出力信号F_GTを1として、A>Bであることを示す。
図4の比較器のA入力(A[51:0])及びB入力(B[51:0])に、図2におけるFOPA及びFOPBを接続し、図4の比較器のF_GT出力に、図2におけるORゲート18を接続すると、図8に示されるNEG信号が得られる。尚、図4のF_EQ信号は、前述の図3におけるFA_EQ_FB(又は、FOPA_EQ_FOPB)信号として用いられる。
図5は、実施例1に係る絶対値加算器16の一例を示す図である。図5において、キャリー伝播ブロック20は、絶対値加算器16のキャリー伝播を行うブロックであり、詳細については、後述する。
図5中、SUB信号は、オペランドAとオペランドBの符号が異なるときに1、符号が等しい時には0となる信号であり、符号・指数処理部10から出力されるSUB信号と同じものである。NEG信号は、図2におけるNEG信号であり、ORゲート18により生成される信号である。
図5において、nビット目の入力A[n]とB[n]の論理積である生成項(Generation term)はANDゲート16−4で生成され、キャリー伝播ブロック20のGn端子に入力される。また、nビット目のA[n]とB[n]の排他的論理和として得られる伝播項(Propagation term)はEOR(Exclusive−OR)ゲート16−5で生成され、キャリー伝播ブロック20のPn端子に入力される。n−1ビット目から0ビット目の生成項及び伝播項についても同様の論理で生成され、キャリー伝播ブロック20の対応する各端子に入力される。
ここで、nビット目の加算結果SUM[n]は、伝播項Pnとキャリー伝播ブロック20のキャリー出力Cnの排他的論理和で求められる。そのため、再補数化を考慮しなければ、nビット目の加算結果はEORゲート16−5の出力とキャリー伝播ブロック20のCn出力のEOR論理をとればよいことになる。しかし、前述の通り、絶対値加算器において絶対値|A−B|を計算する際に、A−B>0の場合は、
を計算し、A−B<0の場合は
を計算することになる。すなわち、A−B<0の場合、キャリー入力が0の
の加算結果に対して1の補数をとる再補数化処理が必要となってくる。
本実施形態では、再補数化処理を加算後に行うのではなく、キャリー伝播回路20の前に移動し、キャリーよりも早く確定する半加算結果(図4ではEORゲート16−5出力)に対して再補数化処理を行う。
具体的には、絶対値加算器16において再補数化するためのEORゲート16−6を、A[n]とB[n]の半加算結果を生成するEORゲート16−5の直後に設け、再補数化するか否かを再補数化要求信号RECOMPにより制御する。再補数化要求信号RECOMPは、ANDゲート16−2においてSUB信号とNEG信号の論理積をとることにより生成する。
また、合わせて、減算時にA−B<0となる場合にはキャリー入力を0にするために、キャリー伝播ブロック20のキャリー入力端子Cinには、AND回路16−1においてNEG信号を反転したインバータ16−3の出力信号とSUB信号との論理積をとった信号を入力する。
図6は、図5におけるキャリー伝播ブロック20の一例を示した図である。図6は64ビットのキャリー生成ブロックの概略図であり、ビット幅64ビットまでの加算器に対応できる。図6の64ビット・キャリー生成ブロックは、4つの16ビットブロック140〜143と、各16ビットブロック140〜143のキャリー生成を行なうための中間信号GG、GP信号を扱うブロック144と、キャリー伝播ブロック20から出力するキャリー信号C[63:0]を生成するブロック145−1〜145−8とを有する。
図7は、図6中の16ビットブロック140〜143の一例を示した図である。図7の16ビット・キャリー生成ブロックは、4つの4ビットブロック150〜153と、各4ビットブロックのキャリー生成を行なうための中間信号DG、DP信号を扱うブロック154と、16ビットキャリー生成ブロック140〜143から出力するキャリー生成用信号C0[15:1]とCP[15:1]とを生成するブロック155−1〜155−15とを有する。図7の16ビットブロックは図6中のブロック140に対応し、図7での入力信号G[15:0]及びP[15:0]は、図6におけるブロック140に入力されるG[15:0]及びP[15:0]となる。
各4ビットブロック150〜153は、図7中の4ビットブロック153に示す構成となっている。図5に示すように、キャリー伝播ブロック20の外側で生成されて入力される生成項G[n]と伝播項P[n]の各ビットに対して、4ビットブロック153では以下の信号を生成する。
4ビットブロック153内のG[3:0]及びP[3:0]は、16ビットブロックに入力されるG[15:12]及びP[15:12]が接続される。
バッファ153−2は、入力されたG[0]をそのままC0[1]として出力する。ORゲート153−4は、P[1]とG[0]との論理積とG[1]との論理和をとって、C0[2]を出力する。 ORゲート153−6は、P[2]とP[1]とG[0]との論理積と、P[2]とG[1]との論理積と、G[2]との論理和をとってC0[3]を出力する。ORゲート153−8は、P[3]とP[2]とP[1]とG[0]との論理積と、P[3]とP[2]とG[1]との論理積と、P[3]とG[2]との論理積と、G[3]との論理和をとってDGを出力する。
バッファ153−1は、入力されたP[0]をそのままCP[1]として出力する。ANDゲート153−3は、P[1]とP[0]との論理積をとってCP[2]を出力する。ANDゲート153−5は、P[2]とP[1]とP[0]との論理積をとってCP[3]を出力する。ANDゲート153−7は、P[3]とP[2]とP[1]とP[0]との論理積をとってDPを出力する。
図7に示す16ビットブロックが処理する生成項G[15:0]より上位ビットの生成項G[31:16]、G[47:32]、G[63:48]、及び、伝播項P[15:0]より上位ビットの伝播項P[31:16]、P[47:32]、P[63:48]の各信号についても、図7に示す4ビットブロック151〜153と同様の構成を持つビットブロックで同じように処理される。
図7中、ブロック154は、各4ビットブロック150〜153と同様の回路構成となっている。ブロック154のG[3:0]には、各4ビットブロックから出力されるDG信号が接続され、P[3:0]には、各4ビットブロックから出力されるDP信号が接続される。そして、ブロック154に含まれるORゲート154−8は、4ビットブロック153におけるORゲート153−8と同様の論理により16ビットブロックのキャリー生成を行なうための中間信号GG信号を出力する。また、ANDゲート154−7は、4ビットブロック153におけるANDゲート153−7と同様の論理により16ビットブロックのキャリー生成を行なうための中間信号GP信号を出力する。また、ブロック154でも、4ビットブロック150〜153と同様の論理でC0[3:0]信号及びCP[3:0]信号を生成して出力する。
ブロック155−1〜155−15は、各4ビットブロック150〜153及びブロック154から出力されたC0[3:0]信号及びCP[3:0]信号を用いて、16ビットブロックのC0[15:1]信号及びCP[15:1]信号を生成して出力する。具体的には、図7に示す16ビットブロック140から出力されるC0[3:1]及びCP[3:1]は、4ビットブロック150から出力されるC0[3:0]及びCP[3:1]をそのままバッファを介して生成される。
16ビットブロックから出力されるC0[4]及びCP[4]は、ブロック154から出力されるC0[1]及びCP[1]をそのままバッファを介して生成される。16ビットブロックから出力されるC0[7:5]は、4ビットブロック151から出力されるCP[3:1]の各ビットとブロック154から出力されるC0[1]との論理積と、4ビットブロック151から出力されるC0[3:1]の各ビットとの論理和をとることにより生成される。16ビットブロックから出力されるCP[7:5]は、4ビットブロック151から出力されるCP[3:1]の各ビットとブロック154から出力されるCP[1]との論理積をとることにより生成される。
16ビットブロックから出力されるC0[8]及びCP[8]は、ブロック154から出力されるC0[2]及びCP[2]をそのままバッファを介して生成される。16ビットブロックから出力されるC0[11:9]は、4ビットブロック152から出力されるCP[3:1]とブロック154から出力されるC0[2]との論理積と、4ビットブロック152から出力されるC0[3:1]との論理和をとることにより生成される。16ビットブロックから出力されるCP[11:9]は、4ビットブロック152から出力されるCP[3:1]とブロック154から出力されるCP[2]との論理積をとることにより生成される。
16ビットブロックから出力されるC0[12]及びCP[12]は、ブロック154から出力されるC0[3]及びCP[3]をそのままバッファを介して生成される。16ビットブロックから出力されるC0[15:13]は、4ビットブロック153から出力されるCP[3:1]とブロック154から出力されるC0[3]との論理積と、4ビットブロック153から出力されるC0[3:1]との論理和をとることにより生成される。16ビットブロックから出力されるCP[15:13]は、4ビットブロック153から出力されるCP[3:1]とブロック154から出力されるCP[3]との論理積をとることにより生成される。
図6では、前記のように構成された各16ビットブロック140〜143、ブロック144、及びブロック145−1〜145−8により、64ビットブロックキャリーブロックとしてのキャリー出力信号C[63:0]を生成する。以下、具体的に説明する。
図6中、ブロック144は、各4ビットブロック150〜153と同様の回路構成となっている。ブロック144のG[3:0]には、各16ビットブロック140〜143から出力されるGG信号が接続され、P[3:0]には、各16ビットブロック140〜143から出力されるGP信号が接続される。そして、ブロック144に含まれるORゲート144−1は、4ビットブロック153におけるORゲート153−8と同様の論理により64ビットブロックのキャリー生成を行なうための中間信号DG信号を出力する。また、ANDゲート144−2は、4ビットブロック153におけるANDゲート153−7と同様の論理により64ビットブロックのキャリー生成を行なうための中間信号DP信号を出力する。また、ブロック144でも、4ビットブロック150〜153と同様の論理でC0[3:0]信号及びCP[3:0]信号を生成して出力する。
ブロック145−1〜145−8は、各16ビットブロック140〜143及びブロック144から出力されたC0[3:0]信号及びCP[3:0]信号を用いて、64ビットブロックとしてのキャリーアウト信号C[63:0]を生成して出力する。
64ビットブロックから出力されるC[0]は、ブロック145−1において、64ビットブロックへ入力されるキャリー入力信号であるCINをそのままバッファを介して生成される。ここで、キャリー入力信号CINに入力される信号は、図5におけるANDゲート16−1で生成された信号と同じ信号である。
C[15:1]は、ブロック145−2において、16ビットブロック140から出力されるCP[15:1]とCINとの論理積をとった信号と、16ビットブロック140から出力されるC0[15:0]との論理和をとることにより生成される。
C[16]は、ブロック145−3において、ブロック144から出力されるCP[1]とCINとの論理積をとった信号と、ブロック144から出力されるC0[1]との論理和をとることにより生成される。
C[31:17]は、ブロック145−4において、16ビットブロック141から出力されるCP[15:1]とブロック144から出力されるCP[1]とCINとの論理積をとった信号と、16ビットブロック141から出力されるCP[15:1]と、ブロック144から出力されるC0[1]の論理積をとった信号と、16ビットブロック141から出力されるC0[15:1]との論理和をとることにより生成される。
C[32]は、ブロック145−5において、ブロック144から出力されるCP[2]とCINとの論理積をとった信号と、ブロック144から出力されるC0[2]との論理和をとることにより生成される。
C[47:33]は、ブロック145−6において、16ビットブロック142から出力されるCP[15:1]とブロック144から出力されるCP[2]とCINとの論理積をとった信号と、16ビットブロック142から出力されるCP[15:1]とブロック144から出力されるC0[2]との論理積をとった信号と、16ビットブロック142から出力されるC0[15:1]との論理和をとることにより生成される。
C[48]は、ブロック145−7において、ブロック144から出力されるCP[3]とCINとの論理積をとった信号と、ブロック144から出力されるC0[3]との論理和をとることにより生成される。
C[63:49]は、ブロック145−8において、16ビットブロック143から出力されるCP[15:1]とブロック144から出力されるCP[3]とCINとの論理積をとった信号と、16ビットブロック143から出力されるCP[15:1]とブロック144から出力されるC0[3]の論理積をとった信号と、16ビットブロック143から出力されるC0[15:1]との論理和をとることにより生成される。
なお、図6のブロック144のORゲート144−1により生成されるCOUT_CIN0信号は、CINが0である場合の加算器のキャリー出力に対応し、COUT_CIN1は、CINが1である場合の加算器のキャリー出力に対応する。本実施例においては、特にこれらCOUT_CIN0及びCOUT_CIN1の各信号は使用していないが、たとえば絶対値加算結果の選択や、再補数化の判定等に用いることも可能である。
図8は、実施例1における、オペランドAの符号SA、指数部EA、オペランドBの符号SB、指数部EBと、指数部の比較結果に応じて仮数部の交換を実施したあとの仮数部データFOPAとFOPBの値によって、SUB、NEG、RECOMP、CINの値をどう決定するかについてまとめた表である。図中、“−”と表示されている欄は比較不要であることを示す。
図8に示すSUB信号については、符号SAとSBが一致する場合にSUB信号は0に、符号SAとSBが異なる場合にSUBは1になる。NEG信号については、指数部EAとEBが異なる場合及び仮数部FOPAがFOPBよりも大きい場合にNEGは1となり、指数部EAとEBが等しく、かつ仮数部FOPAがFOPB以下の場合にNEGは0となる。RECOMP信号については、減算時(SUB=1)であって、かつ、絶対値加算器の加算結果が負となる場合(NEG=1)にRECOMP信号は1となり、それ以外の場合、RECOMP信号は0となる。CINについては、SUB=1であって、かつ、NEG=0の場合にCINは1となり、それ以外の場合、CINは0となる。
図9は、実施例1における指数データの大小関係と仮数部のオペランドデータの交換の実施についてまとめた表である。図9では、EA=EBの場合にデータ交換を行わないことになっているが、EA=EBの場合にデータ交換を行うようにすることもできる。オペランドのデータ交換は、前述の通り、図3におけるEXPA_GT_EXPB又はEXPB_GT_EXPAを用いて制御することができる。
図10は、オペランドデータの符号SA、SBの値に応じて、補数化回路13におけるビット反転を行うかどうかを表にしたものである。符号SA,SBの値をビット反転に直接使用する代わりに、SUB信号を用いて補数化回路13の制御に用いてもよい。具体的には、SUB信号が1の場合、補数化回路13でビット反転を行い、SUB信号が0の場合、補数化回路13でビット反転しないといった制御を行うことができる。
図11は、図1・図2における正規化と丸め操作を行う正規化処理部17の一実施例を示す図である。図11の実施例では、正規化処理部17は、リーディングゼロカウント部161、シフト制御部162、正規化シフト部163、丸め加算器164、及び丸め判定部165を有する。正規化処理部17に入力される信号160は、図1・図2における絶対値加算器16から出力される加算結果である。
減算時において2つのオペランドの値が近い場合、桁落ちによってMSB(Most Significant Bit)側の1ないし複数のビットが0となることがある。IEEE754のバイナリー・フォーマットでは、仮数部の値を正規化しているため、MSBから見て、最初に“1”となるビットを所定の位置に整列する必要がある。従って、図11の実施例では、絶対値加算器16の加算結果である入力信号160のMSB側から見て最初に“1”となるビット位置をリーディングゼロカウント部161で計数し、該計数値等を用いて正規化シフト部163で信号160をシフトさせる。
図12は、図11におけるリーディングゼロカウント部161が計数したリーディングゼロカウント値(LZC)とデータのビット・マッピングの関係を示す図である。図12(a)における“ADD OP A”及び“ADD OP B”は、図1・図2における絶対値加算器16に入力されるオペランドの仮数部であり、補数化回路13及びアラインメント部14から出力された信号に相当する。“ADD RESULT”は、図1・図2における絶対値加算器16の出力信号に相当する。“after normalize shift”は、図11における正規化シフト部163の出力信号に相当する。
図12(a)において、絶対値加算器16の加算結果(ADD RESULT)のMSBの位置に付された“*”の位置、すなわち、絶対値加算器16への入力仮数部(“ADD OP A”,“ADD OP B”)のMSBビットより1ビット上位の位置が、リーディングゼロカウント値LZC=0の位置となる。
図12(b)は、絶対値加算器16の加算結果(ADD RESULT)に対するリーディングゼロカウント部161でのカウント値LZCを説明する図である。図12(b)中、“x”は任意の値を示す。図12(b)に示すように、MSBの位置に“1”がある場合にはLZC=0となり、MSBから1ビット右の位置に“1”がある場合にはLZC=1となり、MSBから2ビット右の位置に“1”がある場合にはLZC=2となる。以下同様に、MSBから見た“1”の位置が右にシフトするに従って、LZCの値も増加する。
図11のリーディングゼロカウント部161は、図12(a)におけるADD RESULT“*”の位置から見て、最初に“1”となるビットの位置まで何ビットずれているかを計数する。すなわち、リーディングゼロカウント部161は、図12(b)に示すように“ADD RESULT”のMSBから見て何ビット目に“1”が存在するかをカウントして、リーディングゼロカウント値LZCを出力する。リーディングゼロカウント値LZCは、図3における“leading zero result as normalize shift amount”を示す信号としても使用される。
図13は、実施例1に係るリーディングゼロカウント部161の回路例を示す図である。図13は、64ビット幅までカウントできるように構成した回路例である。図12の“ADD RESULT”における最上位ビット、つまり図中で*印をつけてあるビットを図13のA[63]に
接続し、以下“ADD RESULT”のA[62]以降をビットの重み順に接続することで、本実施例1におけるリーディングゼロカウントの機能を実現できる。
図13のリーディングゼロカウント部161の回路例は、4つの16ビットブロック170〜173及びこれらの16ビットブロックの出力結果をまとめるブロック174を有する。各16ビットブロック170〜173は、16ビットブロック173の部分に示されているように、4つの4ビットブロック180〜183及びこれらの4ビットブロックの出力結果をまとめるブロック184を有する。
4ビットブロックの回路について、4ビットブロック183を例に説明する。4ビットブロック183は、入力データA[63:60]のMSB側から見て、最初に“1”となるビットの位置を16進数で示すためのC[1:0]信号を生成する。説明の便宜上、4ビットブロック183へ入力されるデータがA[3:0]であるものとして、以下、説明する。
NANDゲート183−4は、A[3]を反転した信号とA[2]との論理積を反転した信号を生成する。NANDゲート183−5は、A[3]を反転した信号とA[2]を反転した信号とA[1]との論理積を反転した信号を生成する。ANDゲート183−1は、A[3]を反転した信号とNANDゲート183−4の出力信号の論理積をとり、C[1]信号を生成する。ANDゲート183−2は、A[3]を反転した信号とNANDゲート183−5の出力信号の論理積をとり、C[0]信号を生成する。ORゲート183−3は、A[3:0]の各信号の論理和をとることにより、A[3:0]の全ビットが0である場合に“0”となるXALL0信号を生成する。
このようにして生成されたC[1:0]信号及びXALL0信号により、入力データA[i]のMSBから見て何ビット目に“1”があるかを知ることができる。すなわち、A[3:0]=1xxxH(x:任意の値)の場合には、C[1:0]=00Bとなり、XALL0=1となる。A[3:0]=01xxHの場合には、C[1:0]=01Bとなり、XALL0=1となる。A[3:0]=001xHの場合には、C[1:0]=10Bとなり、XALL0=1となる。A[3:0]=0001Hの場合には、C[1:0]=11Bとなり、XALL0=1となる。A[3:0]=0000Hの場合には、C[1:0]=11Bとなり、XALL0=0となり、この場合のC[1:0]は後段で使用されないことになる。
ブロック184では、各4ビットブロック180〜183から出力されるXALL0信号を用いて、各4ビットブロック180〜183から出力されるC[1:0]をセレクトし、ORゲート184−3から16ビットブロック173のC[1:0]として出力する。そして、各4ビットブロック180〜183から出力されるXALL0信号に対して、4ビットブロック183のANDゲート183−1〜183−2と同様の論理により、ANDゲート184−1〜184−2で16ビットブロック173のC[3:2]を生成する。このようにして生成されたC[3:0]は、入力信号A[15:0]のMSB側から見て、最初に“1”となるビットの位置を16進数で示す。ブロック184のORゲート184−4から出力されるXALL0信号は、その16ビットブロック173に含まれる4つの4ビットブロック180〜183への入力信号A[15:0](図ではA[63:48])の全てのビットが0の場合に、XALL0=0となる。
ブロック174の回路構成もブロック184の構成と同様の考え方で構成できる。すなわち、ANDゲート174−1〜174−2及びORゲート174−3で、64ビットブロックのC[5:0]に相当する信号を生成することができる。ここで、64ビットの入力A[63:0]の全ビットがゼロの場合もあり得るので、LZCを[6:0]と1ビット拡張し、A[63:0]の全ビットがゼロの場合には、LZC[6:0]=C[6:0]=1000000Bとすることが望ましい。
従って、ORゲート174−5から出力されるXALL0信号を用いてANDゲート174−1〜174−2の出力及びORゲート174−3の出力をANDゲート174−4でマスクし、C[5:0]を生成する。そして、ORゲート174−5で生成されたXALL0をインバータ174−7で反転させてC[6]を生成する。このようにして、64ビットブロックのLZC[6:0]信号を生成することができる。
ところで、IEEE754規格では、各種の異常な演算を検出して、OSに割込みをあげるトラップ条件が規定されている。そのため、浮動小数点加算器を有するプロセッサ等においては、トラップが発生した場合に割込みを発生させるかどうかを制御する回路(以下、「トラップ割込み制御回路」という)を有するのが一般的である。
シフト制御部162は、IEEE754におけるアンダーフロー割込みがトラップ割込み制御回路で許可されている場合には、リーディングゼロカウントの計数結果を採用する。トラップ割込み制御回路においてアンダーフロー割込みが許可されていない場合には、シフト制御部162は、リーディングゼロカウント部161の計数結果と、図3における指数差により選択した指数(EXP BEFORE NORMLIZE)とで、指数値の値を比較して値の小さな方を選択する。正規化シフト部163は、シフト制御部162で選択された値の分だけ正規化シフタ163で絶対値加算器出力の仮数部の演算結果データを左シフト(MSB側へシフト)して正規化を行なう。
図3における指数差により選択した指数(EXP BEFORE NORMLIZE)は、IEEE754におけるdenormalized numberに対応する正規化位置に対応するものであり、本実施例では、アンダーフロー割込みを起さない場合、正規化シフト部163は、denormalized numberとして演算結果を出力する。
丸め判定部165は、正規化シフト部163で絶対値加算器からの出力データを正規化した後のデータのうち、仮数部の演算結果として出力される部分のLSB(Least Significant Bit)側とその下位のビットパターンを判定する。ここで、IEEE754では、演算結果の丸めに関していくつかの丸めモードを規定しており、IEEE754の丸めモードに従った丸めを行なう場合には、丸め判定部165は、IEEE754規格に沿ったように丸めを行なうかどうかを決定する。
丸め加算器164(round adder)は、インクリメンタで構成することができる。丸め加算器164で+1操作を行うと、データパターンによっては丸め加算器164の出力に桁上りが発生することがある。従って、丸め加算器164はキャリー出力(carry out)信号(図3におけるround carry out)を生成し、MSBから桁あがりが発生した場合にはキャリー出力信号によって符号・指数処理部10に通知する。符号・指数処理部10では、丸め加算器164から出力されるキャリー出力信号を用いて指数値の補正が行われる。
丸め加算器164は、丸め判定部165で判定した結果に基づいて、正規化シフト部163から出力されたデータのうち、丸めを行なう部分に対して+1もしくは+0操作を行い、浮動小数点加算器の加算結果における仮数部の結果(result)を出力する。