(57)【特許請求の範囲】
【請求項１】
Ｎを２以上の整数とし、Ｍを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施して、Ｍビットの演算結果をＮ個得る処理をコンピュータに実行させる演算方法であって、
前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、当該仮演算結果のＭビット毎の、前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、
前記Ｍビットの演算結果をＮ個得る場合に、前記仮演算結果を、Ｍビット単位で前記補正情報を用いて補正する補正ステップと
を備えることを特徴とする演算方法。
【請求項２】
前記補正ステップは、
前記仮演算結果のうちの、最下位のＭビットを除く部分を補正すること
を特徴とする請求項１に記載の演算方法。
【請求項３】
前記演算方法は、さらに、
Ｐを、２以上且つＮ／２以下の整数とする時、Ｍ×ＰビットのオペランドＮ／Ｐ個に対して並列に前記演算を施して、Ｍ×Ｐビットの演算結果をＮ／Ｐ個得ることができ、
前記演算ステップは、前記ＭビットのオペランドＮ個を、又は、前記Ｎ×ＰビットのオペランドＮ／Ｐ個を連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、前記補正情報を生成し、
前記補正ステップは、前記Ｍ×Ｐビットの演算結果をＮ／Ｐ個得る場合に、前記仮演算結果を、Ｍ×Ｐビット単位で前記補正情報中のＭ×Ｐビット毎の影響に対応する部分のみを用いて補正すること
を特徴とする請求項１及び２のいずれか１項に記載の演算方法。
【請求項４】
前記Ｎは８であり、前記Ｍは８であり、前記Ｐは２、４又は２と４の両方であること、
あるいは、前記Ｎは４であり、前記Ｍは１６であり、前記Ｐは２であること
を特徴とする請求項３に記載の演算方法。
【請求項５】
前記演算には複数の種類があり、
前記演算ステップは、
Ｌを０からＮ−１までのＮ個の整数とし、最下位桁を１番目の桁とする時、Ｍビット毎に、前記演算の種類と、前記演算によって各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げの有無とに基づいて、各Ｍ×Ｌ＋１番目の桁が０及び１のいずれかである、又は、０及び−１のいずれかである補正情報を生成し、
前記補正ステップは、
前記Ｍビットの演算結果をＮ個得る場合に、前記演算の種類に関わらず、前記仮演算結果に、Ｍビット単位で前記補正情報を加算又は減算すること
を特徴とする請求項１及び２のいずれか１項に記載の演算方法。
【請求項６】
前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、
前記演算ステップは、
前記演算の種類が１加算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を−１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、
前記演算の種類が１減算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、
前記演算の種類がニ数加算である時には、加算すべき一方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを一方の１個の仮オペランドとし、加算すべき他方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを他方の１個の仮オペランドとして、これら２個の仮オペランドをニ数加算することによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、
前記演算の種類がニ数減算である時には、減算されるべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算されるべき１個の仮オペランドとし、減算すべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算すべき１個の仮オペランドとして、これら２個の仮オペランドをニ数減算することによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を−１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、
前記補正ステップは、
前記Ｍビットの演算結果をＮ個得る場合に、前記仮演算結果から、Ｍビット単位で前記補正情報を減算すること
を特徴とする請求項５に記載の演算方法。
【請求項７】
前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、
前記演算ステップは、
前記演算の種類が１加算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、
前記演算の種類が１減算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、
前記演算の種類がニ数加算である時には、加算すべき一方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを一方の１個の仮オペランドとし、加算すべき他方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを他方の１個の仮オペランドとして、これら２個の仮オペランドをニ数加算することによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、
前記演算の種類がニ数減算である時には、減算されるべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算されるべき１個の仮オペランドとし、減算すべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算すべき１個の仮オペランドとして、これら２個の仮オペランドをニ数減算することによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、
前記補正ステップは、
前記Ｍビットの演算結果をＮ個得る場合に、前記仮演算結果に、Ｍビット単位で前記補正情報を加算すること
を特徴とする請求項５に記載の演算方法。
【請求項８】
前記演算には複数の種類があり、
前記演算ステップは、さらに、
前記演算の種類を保持し、
前記補正ステップは、
前記仮演算結果を、前記演算ステップにおいて保持された演算の種類に応じて補正すること
を特徴とする請求項１及び２のいずれか１項に記載の演算方法。
【請求項９】
前記演算ステップは、
前記演算によって各下位桁から各上位桁へ及ぼされた桁上げの有無を補正情報として生成すること
を特徴とする請求項８に記載の演算方法。
【請求項１０】
前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、
前記補正ステップは、
前記Ｍビットの演算結果をＮ個得る場合であって、Ｌを０からＮ−１までのＮ個の整数とし、最下位桁を１番目の桁とする時、
前記演算ステップにおいて保持された演算の種類が、１加算、及び、ニ数減算のいずれかである場合には、前記演算ステップにより生成された補正情報に基づいて、前記仮演算結果の桁上げが無かったＭ×Ｌ＋１番目の桁に１を加算し、
前記演算ステップにおいて保持された演算の種類が、１減算、及び、ニ数加算のいずれかである場合には、前記演算ステップにより生成された補正情報に基づいて、前記仮演算結果の桁上げが有ったＭ×Ｌ＋１番目の桁から１を減算すること
を特徴とする請求項９に記載の演算方法。
【請求項１１】
Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施して、Ｎ個の演算結果を得る処理をコンピュータに実行させる演算方法であって、
前記Ｎ個のオペランドを連結して１個の仮オペランドとして、前記演算を施すことによって、前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に、当該仮演算結果と、前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、
前記Ｎ個の演算結果を得る場合に、前記仮演算結果を、前記補正情報を用いて補正し、Ｎ個に分割する補正ステップと
を備えることを特徴とする演算方法。
【請求項１２】
Ｍを１以上の整数とする時、前記オペランドのビット長はＭビットであり、前記演算結果のビット長はＭ×２ビットであり、
前記演算ステップは、
前記Ｎ個のオペランドを連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによって、Ｎ×Ｍ×２ビットの仮演算結果を１個得ると共に、当該仮演算結果のＭ×２ビット毎の、前記演算によって及ぼされる他のＭ×２ビットからの影響に基づいて補正情報を生成すること
を特徴とする請求項１１に記載の演算方法。
【請求項１３】
前記演算方法は、さらに、
Ｐを２以上、且つ、Ｎ／２以下の整数とする時、Ｍ×ＰビットのオペランドＮ／Ｐ個に対して並列に前記演算を施して、Ｍ×Ｐ×２ビットの演算結果をＮ／Ｐ個得ることができ、
前記演算ステップは、
前記ＭビットのオペランドＮ個、又は、前記Ｎ×ＰビットのオペランドＮ／Ｐ個を連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによって、Ｎ×Ｍ×２ビットの仮演算結果を１個得ると共に、Ｌを１からＮ−１までのＮ−１個の整数とし、最下位桁を１番目の桁とする時、Ｍ×２ビット毎に、前記演算によって各Ｍ×２×Ｌ番目の桁以下と各Ｍ×２×Ｌ＋１桁番目の以上との間で及ぼしあうＮ−１個の影響に基づいて第１補正情報を生成し、Ｍ×２×Ｐビット毎に、前記演算によって各Ｍ×２×Ｐ×Ｌ番目の桁以下とＭ×２×Ｌ＋１番目の桁以上との間で及ぼしあうＮ／Ｐ−１個の影響に基づいて第２補正情報を生成し、
前記補正ステップは、
前記Ｍ×２ビットの演算結果をＮ個得る場合に、前記仮演算結果を前記第１補正情報を用いて補正し、前記Ｍ×Ｐ×２ビットの演算結果をＮ／Ｐ個得る場合に、前記仮演算結果を前記第２補正情報を用いて補正すること
を特徴とする請求項１２に記載の演算方法。
【請求項１４】
前記Ｎは８であり、
前記Ｍは４であり、
前記Ｐは２であり、
前記演算は乗算であること
を特徴とする請求項１３に記載の演算方法。
【請求項１５】
所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と、前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行する演算装置であって、
前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことを指示する演算命令と、
前記演算命令による演算結果を、前記SIMD演算の演算結果に補正することを指示するSIMD補正命令と
を実装することを特徴とする演算装置。
【請求項１６】
前記演算装置は、
Ｎを２以上の整数とし、Ｍを１以上の整数とする時、Ｎ×Ｍビットの第１ビット長オペランド１個に前記演算を施してＮ×Ｍビットの第１ビット長演算結果を１個得る既存演算と、Ｍビットの第２ビット長オペランドＮ個に対して並列に前記演算を施して、Ｍビットの第２ビット長演算結果をＮ個得るＮ並列SIMD演算とを実行するものであり、
前記第１ビット長演算結果、及び、前記補正に用いられる補正情報を保持する保持手段と、
前記演算命令、及び、Ｎ並列SIMD補正命令を解読する解読手段と、
前記演算命令が解読された場合に、前記１個の第１ビット長オペランドに、又は、前記Ｎ個の前記第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことによって、Ｎ×Ｍビットの第１ビット長演算結果を１個得てこれを前記保持手段に保持すると共に、当該第１ビット長演算結果のＭビット毎の、前記演算によって及ぼされる各隣接桁からの影響に基づいて前記補正情報を生成してこれを前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に、前記保持手段に保持された第１ビット長演算結果を、Ｍビット単位で前記保持手段に保持された補正情報を用いて補正することによって、前記第２ビット長演算結果をＮ個得る実行手段と
を備えることを特徴とする請求項１５に記載の演算装置。
【請求項１７】
前記実行手段は、
前記Ｎ並列SIMD補正命令が解読された場合に、前記第１ビット長演算結果のうちの、最下位のＭビットを除く部分を補正すること
を特徴とする請求項１６に記載の演算装置。
【請求項１８】
前記演算装置は、さらに、
Ｐを、２以上且つＮ／２以下の整数とする時、Ｍ×Ｐビットの第３ビット長オペランドＮ／Ｐ個に対して並列に前記演算を施して、Ｍ×Ｐビットの第３ビット長演算結果をＮ／Ｐ個得るＮ／Ｐ並列SIMD演算を実行することができ、
前記解読手段は、さらに、Ｎ／Ｐ並列SIMD補正命令を解読し、
前記実行手段は、
前記演算命令が解読された場合に、前記１個の第１ビット長オペランドに、前記Ｎ個の前記第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、又は、前記Ｎ／Ｐ個の第３ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことによって、第１ビット長演算結果を得てこれを前記保持手段に保持すると共に、当該第１ビット長演算結果のＭビット毎の、前記演算によって及ぼされる各隣接桁からの影響に基づいて前記補正情報を生成してこれを前記保持手段に保持し、
前記Ｎ／Ｐ並列SIMD演算が解読された場合に、前記保持手段に保持された第１ビット長演算結果を、Ｍ×Ｐビット単位で前記保持手段に保持された補正情報中のＭ×Ｐビット毎の影響に対応する部分のみを用いて補正すること
を特徴とする請求項１６及び１７のいずれか１項に記載の演算装置。
【請求項１９】
前記Ｎは８であり、前記Ｍは８であり、前記Ｐは２、４又は２と４の両方であること、
あるいは、前記Ｎは４であり、前記Ｍは１６であり、前記Ｐは２であること
を特徴とする請求項１８に記載の演算装置。
【請求項２０】
前記演算には複数の種類があり、
前記実行手段は、
Ｌを０からＮ−１までのＮ個の整数とし、最下位桁を１番目の桁とする時、前記演算命令が解読された場合に、Ｍビット毎に、前記演算の種類と、前記演算によって各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げの有無とに基づいて、各Ｍ×Ｌ＋１番目の桁が０及び１のいずれかである、又は、０及び−１のいずれかである補正情報を生成し、前記SIMD補正命令が解読された場合に、前記演算の種類に関わらず、前記保持手段に保持された第１ビット長演算結果に、Ｍビット単位で前記保持手段に保持された補正情報を加算又は減算することによって、前記第２ビット長演算結果をＮ個得ること
を特徴とする請求項１６及び１７のいずれか１項に記載の演算装置。
【請求項２１】
前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、
前記実行手段は、
前記演算命令が解読された場合で、且つ、前記演算の種類が１加算である時には、前記第１ビット長オペランドに１加算して第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を−１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、
前記演算命令が解読された場合で、且つ、前記演算の種類が１減算である時には、前記第１ビット長オペランドから１減算して第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を１として補正情報を生成し、
前記演算命令が解読された場合で、且つ、前記演算の種類がニ数加算である時には、加算すべき一方のＮ個の第２ビット長オペランドを連結して一方の１個の第１ビット長オペランドと見なし、加算すべき他方のＮ個の第２ビット長オペランドを連結して他方の１個の第１ビット長オペランドと見なして、これら２個の第１ビット長オペランドをニ数加算することによって、第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、
前記演算命令が解読された場合で、且つ、前記演算の種類がニ数減算である時には、減算されるべきＮ個の第２ビット長オペランドを連結して減算されるべき１個の第１ビット長オペランドと見なし、減算すべきＮ個の第２ビット長オペランドを連結して減算すべき１個の第１ビット長オペランドと見なして、これら２個の第１ビット長オペランドをニ数減算することによって、第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を−１、桁上げが有ったＭ×Ｌ＋１番目の桁を０として補正情報を生成し、
前記SIMD補正命令が解読された場合に、前記保持手段に保持された第１ビット長演算結果から、Ｍビット単位で前記保持手段に保持された補正情報を減算することによって、前記第２ビット長演算結果をＮ個得ること
を特徴とする請求項２０に記載の演算装置。
【請求項２２】
前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、
前記実行手段は、
前記演算命令が解読された場合で、且つ、前記演算の種類が１加算である時には、前記第１ビット長オペランドに１加算して第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、
前記演算命令が解読された場合で、且つ、前記演算の種類が１減算である時には、前記第１ビット長オペランドから１減算して第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を−１として補正情報を生成し、
前記演算命令が解読された場合で、且つ、前記演算の種類がニ数加算である時には、加算すべき一方のＮ個の第２ビット長オペランドを連結して一方の１個の第１ビット長オペランドと見なし、加算すべき他方のＮ個の第２ビット長オペランドを連結して他方の１個の第１ビット長オペランドと見なして、これら２個の第１ビット長オペランドをニ数加算することによって、第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、
前記演算命令が解読された場合で、且つ、前記演算の種類がニ数減算である時には、減算されるべきＮ個の第２ビット長オペランドを連結して減算されるべき１個の第１ビット長オペランドと見なし、減算すべきＮ個の第２ビット長オペランドを連結して減算すべき１個の第１ビット長オペランドと見なして、これら２個の第１ビット長オペランドをニ数減算することによって、第１ビット長演算結果を得ると共に、桁上げが無かったＭ×Ｌ＋１番目の桁を１、桁上げが有ったＭ×Ｌ＋１番目の桁を０として補正情報を生成し、
前記Ｎ並列SIMD補正命令が解読された場合に、前記保持手段に保持された第１ビット長演算結果から、Ｍビット単位で前記保持手段に保持された補正情報を減算することによって、前記第２ビット長演算結果をＮ個得ること
を特徴とする請求項２０に記載の演算装置。
【請求項２３】
前記演算には複数の種類があり、
前記実行手段は、
前記演算の種類を前記保持手段に保持し、
前記Ｎ並列SIMD補正命令が解読された場合に、前記保持手段に保持された第１ビット長演算結果を、前記保持手段に保持された演算の種類に応じて補正すること
を特徴とする請求項１６に記載の演算装置。
【請求項２４】
前記実行手段は、
前記演算命令が解読された場合に、
前記演算によって各下位桁から各上位桁へ及ぼされた桁上げの有無を補正情報として生成すること
を特徴とする請求項２３に記載の演算装置。
【請求項２５】
前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、
前記実行手段は、
前記Ｎ並列SIMD補正命令が解読された場合であって、Ｌを０からＮ−１までのＮ個の整数とし、最下位桁を１番目の桁とする時、
前記保持手段に保持された演算の種類が、１加算、及び、ニ数減算のいずれかである場合には、前記演算命令が解読された場合に生成された補正情報に基づいて、前記仮演算結果の桁上げが無かったＭ×Ｌ＋１番目の桁に１を加算し、
前記保持手段に保持された演算の種類が、１減算、及び、ニ数加算のいずれかである場合には、前記演算命令が解読された場合に生成された補正情報に基づいて、前記仮演算結果の桁上げが有ったＭ×Ｌ＋１番目の桁から１を減算すること
を特徴とする請求項２４に記載の演算装置。
【請求項２６】
前記演算装置は、
Ｎを２以上の整数とする時、１個の第１ビット長オペランドに前記演算を施して１個の第１ビット長演算結果を得る既存演算と、Ｎ個の第２ビット長オペランドに対して並列に前記演算を施してＮ個の第２ビット長演算結果を得るＮ並列SIMD演算とを実行するものであり、
前記長演算結果、及び、前記補正に用いられる補正情報を保持する保持手段と、
前記演算命令、及び、前記Ｎ並列SIMD補正命令を解読する解読手段と、
前記演算命令が解読された場合に、前記１個の第１ビット長オペランドに、又は、前記Ｎ個の第２ビット長オペランドを連結した１個を第１ビット長オペランドと見なして、前記演算を施すことによって、第１ビット長演算結果を得てこれを前記保持手段に保持すると共に、当該第１ビット長演算結果と、前記Ｎ個の第２ビット長演算結果を連結した１個の第１ビット長演算結果との差分に相当する前記補正情報を生成してこれを前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に、前記保持手段に保持された第１ビット長演算結果を、前記保持手段に保持された補正情報を用いて補正することによって、前記Ｎ並列SIMD演算の第２ビット長演算結果をＮ個得る実行手段と
を備えることを特徴とする請求項１５に記載の演算装置。
【請求項２７】
Ｍを１以上の整数とする時、前記第１ビット長オペランドのビット長はＮ×Ｍビットであり、前記第２ビット長オペランドのビット長はＭビットであり、前記第１ビット長演算結果のビット長はＮ×Ｍ×２ビットであり、前記第２ビット長演算結果のビット長はＭ×２ビットであり、
前記実行手段は、
前記演算命令が解読された場合に、前記１個の第１ビット長オペランドに、又は、前記Ｎ個の第２ビット長オペランドを連結した１個を第１ビット長オペランドと見なして、前記演算を施すことによって、前記Ｎ×Ｍ×２ビットの第１ビット長演算結果を１個得てこれを前記保持手段に保持すると共に、当該第１ビット長演算結果のＭ×２ビット毎の、前記演算によって及ぼされる他のＭ×２ビットからの影響に基づいて補正情報を生成して、これを前記保持手段に保持すること
を特徴とする請求項２６に記載の演算装置。
【請求項２８】
前記演算装置は、さらに、
Ｐを２以上、且つ、Ｎ／２以下の整数とする時、Ｍ×Ｐビットの第３ビット長オペランドＮ／Ｐ個に対して並列に前記演算を施して、Ｍ×Ｐ×２ビットの第３ビット長演算結果をＮ／Ｐ個得るＮ／Ｐ並列SIMD演算を実行することができ、
前記解読手段は、さらに、Ｎ／Ｐ並列SIMD補正命令を解読し、
前記実行手段は、
前記演算命令が解読された場合に、前記１個の第１ビット長オペランドに、前記Ｎ個の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、又は、前記Ｎ／Ｐ個の第３ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことによって、Ｎ×Ｍ×２ビットの第１ビット長演算結果を１個得てこれを前記保持手段に保持すると共に、Ｌを１からＮ−１までのＮ−１個の整数とし、最下位桁を１番目の桁とする時、Ｍ×２ビット毎に、前記演算によって各Ｍ×２×Ｌ番目の桁以下と各Ｍ×２×Ｌ＋１番目の桁以上との間で及ぼしあうＮ−１個の影響に基づいて第１補正情報を生成し、Ｍ×２×Ｐビット毎に、前記演算によって各Ｍ×２×Ｐ×Ｌ番目の桁以下とＭ×２×Ｌ＋１番目の桁以上との間で及ぼしあうＮ／Ｐ−１個の影響に基づいて第２補正情報を生成してこれらを前記保持手段に保持し、
前記Ｎ並列SIMD補正命令が解読された場合に、前記保持手段に保持された第１ビット長演算結果を、前記保持手段に保持された第１補正情報を用いて補正し、前記Ｎ／Ｐ並列SIMD補正命令が解読された場合に、前記保持手段に保持された第１ビット長演算結果を、前記保持手段に保持された第２補正情報を用いて補正すること
を特徴とする請求項２７に記載の演算装置。
【請求項２９】
前記Ｎは８であり、
前記Ｍは４であり、
前記Ｐは２であり、
前記演算は乗算であること
を特徴とする請求項２８に記載の演算装置。
【請求項３０】
前記演算装置は、さらに、
割込み受付時、又は、他のコンテキストへの切り換え時に、前記保持手段に保持された内容を当該演算装置の外部の記憶装置に退避する退避手段と、
前記割込みからの復帰時、又は、元のコンテキストへの切り換え時に、前記記憶装置に退避されている内容を、前記保持手段に復元する復元手段とを備えること
を特徴とする請求項１６、２３、及び、２６のいずれか１項に記載の演算装置。
【請求項３１】
Ｎを２以上の整数とし、Ｍを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施して、Ｍビットの演算結果をＮ個得るＮ並列SIMD（Single Instruction Multiple Data）演算を実行する演算装置であって、
Ｎ個のＭビットのオペランドのそれぞれに１を加えるＮ並列SIMD１加算命令を実装し、
前記Ｎ並列SIMD１加算命令を解読する解読手段と、
前記Ｎ並列SIMD１加算命令が解読された場合に、Ｌを１からＮ−１までのＮ−１個の整数とし、最下位桁を１番目の桁とする時、Ｎ個のＭビットのオペランドを結合したデータと、それぞれがＭビットからなる１を表すデータをＮ個結合したデータとの加算を、各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げ伝播を切断して行う実行手段と
を備えることを特徴とする演算装置。
【請求項３２】
Ｎを２以上の整数とし、Ｍを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施して、Ｍビットの演算結果をＮ個得るＮ並列SIMD（Single Instruction Multiple Data）演算を実行する演算装置であって、
Ｎ個のＭビットのオペランドのそれぞれから１を引くＮ並列SIMD１減算命令を実装し、
前記Ｎ並列SIMD１減算命令を解読する解読手段と、
前記Ｎ並列SIMD１減算命令が解読された場合に、Ｌを１からＮ−１までのＮ−１個の整数とし、最下位桁を１番目の桁とする時、Ｎ個のＭビットのオペランドを結合したデータから、それぞれがＭビットからなる１を表すデータをＮ個結合したデータを引く減算を、各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げ伝播を切断して行う実行手段と
を備えることを特徴とする演算装置。
【請求項３３】
所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換装置であって、
前記プログラム中の演算命令を解析する解析手段と、
前記解析手段により前記SIMD演算命令が解析された場合に、当該SIMD演算命令を、前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換手段と
を備えることを特徴とするプログラム変換装置。
【請求項３４】
所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を、演算装置に実行させるべき構文を含む高級言語プログラムを、前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイル装置であって、
前記高級言語プログラムの構文を解析する解析手段と、
前記解析手段により解析された構文を機械語命令列に変換することにより、機械語プログラムを生成するコンパイル手段とを備え、
前記コンパイル手段は、
前記解析手段により前記SIMD演算を実行させるべき構文が解析された場合に、当該構文を、前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換すること
を特徴とするコンパイル装置。
【請求項３５】
前記コンパイル手段は、
前記解析手段により前記SIMD演算を実行させるべき構文が解析された場合に、当該構文を、前記SIMD演算を示す中間言語コードを含む中間言語コード列に変換する一次変換手段と、
前記SIMD演算を示す中間言語コードを、前記演算機械語命令、及び、SIMD補正機械語命令に変換する二次変換手段とを含むこと
を特徴とする請求項３４に記載のコンパイル装置。
【請求項３６】
所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換方法であって、
前記プログラム中の演算命令を解析する解析ステップと、
前記解析ステップにより前記SIMD演算命令が解析された場合に、当該SIMD演算命令を、前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換ステップと
を含むことを特徴とするプログラム変換方法。
【請求項３７】
所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を、演算装置に実行させるべき構文を含む高級言語プログラムを、前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイル方法であって、
前記高級言語プログラムの構文を解析する解析ステップと、
前記解析手段により解析された構文を機械語命令列に変換することにより、機械語プログラムを生成するコンパイルステップとを備え、
前記コンパイルステップは、
前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に、当該構文を、前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換すること
を特徴とするコンパイル方法。
【請求項３８】
前記コンパイルステップは、
前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に、当該構文を、前記SIMD演算を示す中間言語コードを含む中間言語コード列に変換する一次変換サブステップと、
前記SIMD演算を示す中間言語コードを、前記演算機械語命令、及び、SIMD補正機械語命令に変換する二次変換サブステップとを含むこと
を特徴とする請求項３７に記載のコンパイル方法。
【請求項３９】
所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換プログラムであって、
コンピュータに、
前記プログラム中の演算命令を解析する解析ステップと、
前記解析ステップにより前記SIMD演算命令が解析された場合に、当該SIMD演算命令を、前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換ステップと
を実行させることを特徴とするプログラム変換プログラム。
【請求項４０】
所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を、演算装置に実行させるべき構文を含む高級言語プログラムを、前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイルプログラムであって、
コンピュータに、
前記高級言語プログラムの構文を解析する解析ステップと、
前記解析手段により解析された構文を機械語命令列に変換することにより、機械語プログラムを生成するコンパイルステップとを備え、
前記コンパイルステップは、
前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に、当該構文を、前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換すること
を実行させることを特徴とするコンパイルプログラム。
【請求項４１】
前記コンパイルステップは、
前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に、当該構文を、前記SIMD演算を示す中間言語コードを含む中間言語コード列に変換する一次変換サブステップと、
前記SIMD演算を示す中間言語コードを、前記演算機械語命令、及び、SIMD補正機械語命令に変換する二次変換サブステップとを含むこと
を特徴とする請求項４０に記載のコンパイルプログラム。
【請求項４２】
Ｎを２以上の整数とし、Ｍを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施して、Ｍビットの演算結果をＮ個得る処理を、コンピュータに実行させる演算プログラムであって、
コンピュータに、
前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、当該仮演算結果のＭビット毎の、前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、
前記Ｍビットの演算結果をＮ個得る場合に、前記仮演算結果を、Ｍビット単位で前記補正情報を用いて補正する補正ステップと
を実行させることを特徴とする演算プログラム。
【請求項４３】
前記補正ステップは、
前記仮演算結果のうちの、最下位のＭビットを除く部分を補正すること
を特徴とする請求項４２に記載の演算プログラム。
【請求項４４】
Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施して、Ｎ個の演算結果を得る処理をコンピュータに実行させる演算プログラムであって、
コンピュータに、
前記Ｎ個のオペランドを連結して１個の仮オペランドとして、前記演算を施すことによって、前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に、当該仮演算結果と、前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、
前記Ｎ個の演算結果を得る場合に、前記仮演算結果を、前記補正情報を用いて補正し、Ｎ個に分割する補正ステップと
を実行させることを特徴とする演算プログラム。
【請求項４５】
コンピュータに、所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と、前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行させる演算プログラムであって、
前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことを、コンピュータに指示する演算命令と、
前記演算命令による演算結果を、前記SIMD演算の演算結果に補正することを、コンピュータに指示するSIMD補正命令と
を含むことを特徴とする演算プログラム。
【請求項４６】
Ｎを２以上の整数とし、Ｍを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施して、Ｍビットの演算結果をＮ個得る処理を、コンピュータに実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、
コンピュータに、
前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによって、Ｎ×Ｍビットの仮演算結果を１個得ると共に、当該仮演算結果のＭビット毎の、前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、
前記Ｍビットの演算結果をＮ個得る場合に、前記仮演算結果を、Ｍビット単位で前記補正情報を用いて補正する補正ステップと
を実行させることを特徴とする演算プログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項４７】
前記補正ステップは、
前記仮演算結果のうちの、最下位のＭビットを除く部分を補正すること
を特徴とする請求項４６に記載の演算プログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項４８】
Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施して、Ｎ個の演算結果を得る処理をコンピュータに実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、
コンピュータに、
前記Ｎ個のオペランドを連結して１個の仮オペランドとして、前記演算を施すことによって、前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に、当該仮演算結果と、前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、
前記Ｎ個の演算結果を得る場合に、前記仮演算結果を、前記補正情報を用いて補正し、Ｎ個に分割する補正ステップと
を実行させることを特徴とする演算プログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項４９】
コンピュータに、所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と、前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことを、コンピュータに指示する演算命令と、
前記演算命令による演算結果を、前記SIMD演算の演算結果に補正することを、コンピュータに指示するSIMD補正命令と
を含むことを特徴とする演算プログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、マイクロプロセッサにおいて、一つの命令で複数のオペランドに対して同一演算を施すことことで処理速度の高速化を図る技術であるSIMD（Single Instruction Multiple Data; 単一命令複数データ）に関する。
【０００２】
【従来の技術】
画像や音声を扱うマルチメディアデータ処理では、例えば、画像全体にフィルターをかけて色調や画質等を変化させるような、膨大な量のデータに同じ計算処理を施す作業が必要になる。
SIMDを実装しない通常のプロセッサは、１データ毎に１命令を実行しなくてはならず、マルチメディアデータ処理に膨大な時間がかかる。
【０００３】
これに対して、SIMDを実装したプロセッサは、１命令で複数のデータを同時に処理することが可能なので、マルチメディアデータ処理の時間を大幅に短縮できる。
このようにSIMDはマルチメディアデータ処理に極めて有効な技術であり、近年、マルチメディア機器の台頭に伴って各種のプロセッサがSIMD演算命令を実装する傾向がある。
【０００４】
例えば、６４ビット幅の加算器を備えるプロセッサは、並列加算演算を実行するSIMD演算命令として、８ビットデータの加算を同時に８並列実行するADDS8命令、１６ビットデータの加算を同時に４並列実行するADDS16命令、及び、３２ビットデータの加算を同時に２並列実行するADDS32命令の３種類を実装する。
【０００５】
【発明が解決しようとする課題】
SIMD演算命令の総命令数は、並列演算の対象とするデータサイズのパターン数と演算の種別数との積となるので、データサイズのパターン数が複数ある場合には命令数が飛躍的に増えてしまう。
命令数が増えると、機械語命令のビット割付を圧迫し、またプロセッサにおいては命令デコーダ回路が大規模化してコスト及び消費電力の増加を招く。
【０００６】
さらには、もとより演算命令を数十個程度しか実装せず命令数が少ないことを利点とするRISC命令セットアーキテクチャにおいて、SIMD演算命令を実装する場合に極めて大きな問題となる。
そこで、本発明は、命令数の増加を抑えつつSIMD演算を実装することができる演算方法、演算装置、当該演算装置用にプログラムを変換するプログラム変換装置、当該演算装置用のプログラムを生成するコンパイル装置、プログラム変換方法、コンパイル方法、プログラム変換プログラム、コンパイルプログラム、演算プログラム、及び、演算プログラムを記録した記録媒体を提供することを目的とする。
【０００７】
【課題を解決するための手段】
上記目的を達成するために、本発明に係る演算方法は、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得る処理をコンピュータに実行させる演算方法であって、前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして前記演算を施すことによってＮ×Ｍビットの仮演算結果を１個得ると共に当該仮演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果をＭビット単位で前記補正情報を用いて補正する補正ステップとを備えることを特徴とする。
【０００８】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【０００９】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
また、本発明に係る演算装置において、前記演算には複数の種類があり、前記演算ステップは、さらに、前記演算の種類を保持し、前記補正ステップは、前記仮演算結果を前記演算ステップにおいて保持された演算の種類に応じて補正することを特徴とすることもできる。
【００１０】
これによって、演算の際に演算の種類を保持し、仮演算結果を、保持した演算の種類に応じて補正することができるので、演算の種類を考慮せずに補正情報を生成することができる。
上記目的を達成するために、本発明に係る演算方法は、Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施してＮ個の演算結果を得る処理をコンピュータに実行させる演算方法であって、前記Ｎ個のオペランドを連結して１個の仮オペランドとして前記演算を施すことによって前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に当該仮演算結果と前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、前記Ｎ個の演算結果を得る場合に前記仮演算結果を前記補正情報を用いて補正しＮ個に分割する補正ステップとを備えることを特徴とする。
【００１１】
これによって、Ｎ個のオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個の演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【００１２】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
上記目的を達成するために、本発明に係る演算装置は、所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行する演算装置であって、前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことを指示する演算命令と、前記演算命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正命令とを実装することを特徴とする。
【００１３】
これによって、当該演算装置は、１個の長オペランド、又は、複数の短オペランドを１個の長オペランドと見なして演算する演算命令と、演算結果をSIMD演算の演算結果に補正するSIMD補正命令とを実装することができる。
また、演算命令は既存演算とSIMD演算とで共有でき、SIMD補正命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【００１４】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
また、本発明に係る演算装置において、Ｎを２以上の整数としＭを１以上の整数とする時、Ｎ×Ｍビットの第１ビット長オペランド１個に前記演算を施してＮ×Ｍビットの第１ビット長演算結果を１個得る既存演算とＭビットの第２ビット長オペランドＮ個に対して並列に前記演算を施してＭビットの第２ビット長演算結果をＮ個得るＮ並列SIMD演算とを実行するものであり、前記第１ビット長演算結果、及び、前記補正に用いられる補正情報を保持する保持手段と、前記演算命令、及び、Ｎ並列SIMD補正命令を解読する解読手段と、前記演算命令が解読された場合に前記１個の第１ビット長オペランドに、又は、前記Ｎ個の前記第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことによってＮ×Ｍビットの第１ビット長演算結果を１個得てこれを前記保持手段に保持すると共に当該第１ビット長演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて前記補正情報を生成してこれを前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果をＭビット単位で前記保持手段に保持された補正情報を用いて補正することによって前記第２ビット長演算結果をＮ個得る実行手段とを備えることを特徴とすることもできる。
【００１５】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、本発明に係る演算装置において、前記演算には複数の種類があり、前記実行手段は、前記演算の種類を前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果を前記保持手段に保持された演算の種類に応じて補正することを特徴とすることもできる。
【００１６】
これによって、演算の際に演算の種類を保持し、第１ビット長演算結果を、保持した演算の種類に応じて補正することができるので、演算の種類を考慮せずに補正情報を生成することができる。
また、本発明に係る演算装置において、Ｎを２以上の整数とする時、１個の第１ビット長オペランドに前記演算を施して１個の第１ビット長演算結果を得る既存演算とＮ個の第２ビット長オペランドに対して並列に前記演算を施してＮ個の第２ビット長演算結果を得るＮ並列SIMD演算とを実行するものであり、前記長演算結果、及び、前記補正に用いられる補正情報を保持する保持手段と、前記演算命令、及び、前記Ｎ並列SIMD補正命令を解読する解読手段と、前記演算命令が解読された場合に前記１個の第１ビット長オペランドに、又は、前記Ｎ個の第２ビット長オペランドを連結した１個を第１ビット長オペランドと見なして、前記演算を施すことによって第１ビット長演算結果を得てこれを前記保持手段に保持すると共に当該第１ビット長演算結果と前記Ｎ個の第２ビット長演算結果を連結した１個の第１ビット長演算結果との差分に相当する前記補正情報を生成してこれを前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果を前記保持手段に保持された補正情報を用いて補正することによって前記Ｎ並列SIMD演算の第２ビット長演算結果をＮ個得る実行手段とを備えることを特徴とすることもできる。
【００１７】
これによって、Ｎ個のオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個の演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
上記目的を達成するために、本発明に係るプログラム変換装置は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換装置であって、前記プログラム中の演算命令を解析する解析手段と、前記解析手段により前記SIMD演算命令が解析された場合に当該SIMD演算命令を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換手段とを備えることを特徴とする。
【００１８】
上記目的を達成するために、本発明に係るプログラム変換方法は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換方法であって、前記プログラム中の演算命令を解析する解析ステップと、前記解析ステップにより前記SIMD演算命令が解析された場合に当該SIMD演算命令を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換ステップとを含むことを特徴とする。
【００１９】
上記目的を達成するために、本発明に係るプログラム変換プログラムは、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換プログラムであって、コンピュータに、前記プログラム中の演算命令を解析する解析ステップと、前記解析ステップにより前記SIMD演算命令が解析された場合に当該SIMD演算命令を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換ステップとを実行させることを特徴とする。
【００２０】
これらによって、SIMD演算命令を他の演算命令とSIMD補正命令とに変換することができる。
従って、プロセッサに、演算の種別によらずにデータ幅の種別数によるSIMD補正命令を従来の演算命令に追加して実装させるだけで複数の演算の種別に対するSIMD演算を実行させることができるので、命令数の増加を飛躍的に抑えることができる分だけ命令語長が短くなり、プログラムのコードサイズを縮小することができる。
【００２１】
上記目的を達成するために、本発明に係るコンパイル装置は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を演算装置に実行させるべき構文を含む高級言語プログラムを前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイル装置であって、前記高級言語プログラムの構文を解析する解析手段と、前記解析手段により解析された構文を機械語命令列に変換することにより機械語プログラムを生成するコンパイル手段とを備え、前記コンパイル手段は、前記解析手段により前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換することを特徴とする。
【００２２】
上記目的を達成するために、本発明に係るコンパイル方法は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を演算装置に実行させるべき構文を含む高級言語プログラムを前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイル方法であって、前記高級言語プログラムの構文を解析する解析ステップと、前記解析手段により解析された構文を機械語命令列に変換することにより機械語プログラムを生成するコンパイルステップとを備え、前記コンパイルステップは、前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換することを特徴とする。
【００２３】
上記目的を達成するために、本発明に係るコンパイルプログラムは、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を演算装置に実行させるべき構文を含む高級言語プログラムを前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイルプログラムであって、コンピュータに、前記高級言語プログラムの構文を解析する解析ステップと、前記解析手段により解析された構文を機械語命令列に変換することにより機械語プログラムを生成するコンパイルステップとを備え、前記コンパイルステップは、前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換することを実行させることを特徴とする。
【００２４】
これらによって、SIMD演算の構文を、演算機械語命令とSIMD補正機械語命令とに変換することができる。
従って、プロセッサに、演算の種別によらずにデータ幅の種別数によるSIMD補正機械語命令を従来の演算機械語命令に追加して実装させるだけで複数の演算の種別に対するSIMD演算を実行させることができるので、命令数の増加を飛躍的に抑えることができる分だけ命令語長が短くなり、プログラムのコードサイズを縮小することができる。
【００２５】
上記目的を達成するために、本発明に係る演算プログラムは、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得る処理をコンピュータに実行させる演算プログラムであって、コンピュータに、前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして前記演算を施すことによってＮ×Ｍビットの仮演算結果を１個得ると共に当該仮演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果をＭビット単位で前記補正情報を用いて補正する補正ステップとを実行させることを特徴とする。
【００２６】
上記目的を達成するために、本発明に係る演算プログラムを記録したコンピュータ読み取り可能な記録媒体は、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得る処理をコンピュータに実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、コンピュータに、前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして前記演算を施すことによってＮ×Ｍビットの仮演算結果を１個得ると共に当該仮演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果をＭビット単位で前記補正情報を用いて補正する補正ステップとを実行させることを特徴とする演算プログラムを記録する。
【００２７】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【００２８】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
上記目的を達成するために、本発明に係る演算プログラムは、Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施してＮ個の演算結果を得る処理をコンピュータに実行させる演算プログラムであって、コンピュータに、前記Ｎ個のオペランドを連結して１個の仮オペランドとして前記演算を施すことによって前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に当該仮演算結果と前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、前記Ｎ個の演算結果を得る場合に前記仮演算結果を前記補正情報を用いて補正しＮ個に分割する補正ステップとを実行させることを特徴とする。
【００２９】
上記目的を達成するために、本発明に係る演算プログラムを記録したコンピュータ読み取り可能な記録媒体は、Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施してＮ個の演算結果を得る処理をコンピュータに実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、コンピュータに、前記Ｎ個のオペランドを連結して１個の仮オペランドとして前記演算を施すことによって前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に当該仮演算結果と前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、前記Ｎ個の演算結果を得る場合に前記仮演算結果を前記補正情報を用いて補正しＮ個に分割する補正ステップとを実行させることを特徴とする演算プログラムを記録する。
【００３０】
これによって、Ｎ個のオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個の演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【００３１】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
上記目的を達成するために、本発明に係る演算プログラムは、コンピュータに所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行させる演算プログラムであって、前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことをコンピュータに指示する演算命令と、前記演算命令による演算結果を前記SIMD演算の演算結果に補正することをコンピュータに指示するSIMD補正命令とを含むことを特徴とする。
【００３２】
上記目的を達成するために、本発明に係る演算プログラムを記録したコンピュータ読み取り可能な記録媒体は、コンピュータに所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことをコンピュータに指示する演算命令と、前記演算命令による演算結果を前記SIMD演算の演算結果に補正することをコンピュータに指示するSIMD補正命令とを含むことを特徴とする演算プログラムを記録する。
【００３３】
これによって、当該演算装置は、１個の長オペランド、又は、複数の短オペランドを１個の長オペランドと見なして演算する演算命令と、演算結果をSIMD演算の演算結果に補正するSIMD補正命令とを実装することができる。
また、演算命令は既存演算とSIMD演算とで共有でき、SIMD補正命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【００３４】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
【００３５】
【発明の実施の形態】
（実施の形態１）
＜概要＞
本発明の実施の形態１は、SIMD演算命令を、非並列演算用の演算命令と、非並列演算用の演算命令の演算結果からSIMD演算命令の演算結果へ補正する補正命令とで実現するものである。
【００３６】
本発明の実施の形態１のプロセッサは、非並列演算用の演算命令の実行時に、演算結果と共に、並列演算の対象とするデータサイズの最小単位毎に桁上げの結果を保持しておき、続いて補正命令の実行時に、演算結果に対して、保持しておいた桁上げの結果に基づいて必要な桁位置のみを補正することによりSIMD演算命令の演算結果を得る。
【００３７】
ここで非並列演算用の演算命令は、SIMD演算命令とは無関係に実装されるものなので、この演算命令による命令数の増加はない。
また補正命令は、並列演算の対象とするデータサイズのパターン数分だけ用意すればよいので、演算の種別数との積とはならず命令数が飛躍的に増えることがない。
【００３８】
＜構成＞
図１は、本実施の形態１に係るSIMD演算装置の構成を示す図である。
図１に示すSIMD演算装置１０は、命令フェッチステージ（以下、「ＩＦステージ」と記す）、解読およびレジスタ読出しステージ（以下、「ＤＥＣステージ」と記す）、及び、実行ステージ（以下、「ＥＸステージ」と記す）の３つのステージからなる３段パイプライン構造を成し、ＲＯＭ１、ＩＲ２、ＤＥＣ３、レジスタファイル４、ＥＸＴ５、ＡＲ６、ＢＲ７、ＡＬＵ８、及び、ＣＲ９を備える。
【００３９】
ＲＯＭ１は記録媒体であり、機械語命令プログラムを格納する。
ＩＲ２は命令レジスタであり、ＲＯＭ１からフェッチされた機械語命令を保持する。
ＤＥＣ３は命令解読器であり、ＩＲ２に保持された機械語命令を解読してSIMD演算装置内の各部を制御する。
【００４０】
ここではＤＥＣ３は、ニ数加算命令“ADD D0,D1”、ニ数減算命令“SUB D0,D1”、１加算命令“INC D1”、１減算命令“DEC D1”、８ビットSIMD補正命令“SIMD8 D1”、１６ビットSIMD補正命令“SIMD16 D1”、及び、３２ビットSIMD補正命令“SIMD32 D1”を解読する。
レジスタファイル４は複数のレジスタの集合であり、それぞれ６４ビット幅のＤ０レジスタからＤ１５レジスタまでの１６本のレジスタを内部に持つ。
【００４１】
ＥＸＴ５は拡張器であり、１６ビットSIMD補正命令がＩＲ２により解読された結果としてＣＲ９に格納された８つの８ビットデータのうちの４つを１６ビットデータに符号拡張する１６ビット符号拡張と、３２ビットSIMD補正命令がＩＲ２により解読された結果としてＣＲ９に格納された８つの８ビットデータのうちの２つを３２ビットデータに符号拡張する３２ビット符号拡張を実施し、８ビットSIMD補正命令“SIMD8 D1”がＩＲ２により解読された場合にはＣＲ９に格納された８つの８ビットデータに対する符号拡張は行わずにＢＲ７に格納する。
【００４２】
例えば、“0x??00??01??02??03”を１６ビット符号拡張すると“0x0000000100020003”になり、“0x??FF??FE??FD??FC”を１６ビット符号拡張すると“0xFFFFFFFEFFFDFFFC”になり、また、“0x??????01??????02”を３２ビット符号拡張すると“0x0000000100000002”になり、“0x??????FF??????FE”を３２ビット符号拡張すると“0xFFFFFFFFFFFFFFFE”になる。
【００４３】
なお、“0x”は値が１６進数表示であることを意味し、“?”はここが何であっても結果が同じであることを意味する。
ＡＲ６は６４ビット幅のレジスタであり、レジスタファイル４からの出力を保持する。
ここではＡＲ６は、ニ数加算命令“ADD D0,D1”、ニ数減算命令“SUB D0,D1”、１加算命令“INC D1”、１減算命令“DEC D1”、８ビットSIMD補正命令“SIMD8 D1”、１６ビットSIMD補正命令“SIMD16 D1”、及び、３２ビットSIMD補正命令“SIMD32 D1”の場合に、Ｄ１レジスタからの出力を保持する。
【００４４】
ＢＲ７は６４ビット幅のレジスタであり、レジスタファイル４からの出力、“0x0000000000000001”、又は、ＥＸＴ５の出力を機械語命令に応じて選択して保持する。
ここではＢＲ７は、ニ数加算命令“ADD D0,D1”及びニ数減算命令“SUB D0,D1”を実行する場合にはＤ０レジスタからの出力を、１加算命令“INC D1”及び１減算命令“DEC D1”を実行する場合には“0x0000000000000001”を、８ビットSIMD補正命令“SIMD8 D1”、１６ビットSIMD補正命令“SIMD16 D1”及び３２ビットSIMD補正命令“SIMD32 D1”を実行する場合にはＥＸＴ５の出力を選択して保持する。
【００４５】
ＡＬＵ８は６４ビット幅の加減算器であり、ＡＲ６の内容とＢＲ７の内容とをそれぞれＡ入力とＢ入力として、演算命令実行時にはＡ＋Ｂの加算又はＡ−Ｂの減算を行い演算結果をレジスタに保持させると共に、並列演算の対象とするデータサイズの最小単位である８ビット毎の桁上げの結果を示す桁上げ情報を生成してＣＲ９に保持させ、また、SIMD補正命令実行時には他のSIMD演算結果に影響を及ばさないようにＡ−Ｂの減算を行い当該演算結果を各SIMD演算結果に補正する。
【００４６】
ここではＡＬＵ８は、ニ数加算命令“ADD D0,D1”及び１加算命令“INC D1”を実行する場合にはＡ＋Ｂの加算を行い演算結果を得てＤ１レジスタに保持させると共に、ニ数加算命令では８ビット毎に桁上げが無い場合は０を示し桁上げが有る場合は１を示す桁上げ情報を生成し、１加算命令では８ビット毎に桁上げが無い場合は−１を示し桁上げが有る場合は０を示す桁上げ情報を生成し、また、ニ数減算命令“SUB D0,D1”及び１減算命令“DEC D1”を実行する場合にはＡ−Ｂの減算を行い演算結果を得ると共に、ニ数減算命令では８ビット毎に桁上げが無い場合は−１を示し桁上げが有る場合は０を示す桁上げ情報を生成し、１減算命令では８ビット毎に桁上げが無い場合は０を示し桁上げが有る場合は１を示す桁上げ情報を生成する。さらにＡＬＵ８は、８ビットSIMD補正命令“SIMD8 D1”、１６ビットSIMD補正命令“SIMD16 D1”及び３２ビットSIMD補正命令“SIMD32 D1”を実行する場合には、対応するビット数毎に他に影響を及ばさないようにＡ−Ｂの減算を行い、Ｄ１レジスタに保持していた演算結果を各SIMD演算結果に補正してＤ１レジスタに保持させる。
【００４７】
ＣＲ９は、桁上げ情報を保持する６４ビット幅のレジスタである。
ここで、機械語命令をＲＯＭ１からフェッチし命令レジスタ２へ書込む処理はＩＦステージで行われ、ＤＥＣ３における機械語命令の解読とＥＸＴ５符号拡張とレジスタファイル４又はＥＸＴ５からの出力とはＤＥＣステージで行われ、ＡＬＵ８における演算とＣＲ９への桁上げ情報の保持はＥＸステージで行われる。
【００４８】
＜動作＞
図２（ａ）〜（ｄ）は、ＣＲ９に保持される桁上げ情報のビット構成の一例を示す図である。
図２の各図において、横軸方向に付された“６３，５６，５５，４８，４７，４０，３９，３２，３１，２４，２３，１６，１５，８，７，０”の数字はビット位置を表し、ビット位置０はＬＳＢ（最下位ビット）を、ビット位置６３はＭＳＢ（最上位ビット）を意味する。
【００４９】
図２（ａ）はニ数加算演算命令（ＡＤＤ命令）を実行した時の桁上げ情報を示し、演算結果におけるビット位置７からの桁上げを桁上げ情報のビット位置８に記録し（図中のＣ７）、演算結果におけるビット位置１５からの桁上げを桁上げ情報のビット位置１６に記録し（図中のＣ１５）、演算結果におけるビット位置２３からの桁上げを桁上げ情報のビット位置２４に記録し（図中のＣ２３）、演算結果におけるビット位置３１からの桁上げを桁上げ情報のビット位置３２に記録し（図中のＣ３１）、演算結果におけるビット位置３９からの桁上げを桁上げ情報のビット位置４０に記録し（図中のＣ３９）、演算結果におけるビット位置４７からの桁上げを桁上げ情報のビット位置４８に記録し（図中のＣ４７）、演算結果におけるビット位置５５からの桁上げを桁上げ情報のビット位置５６に記録し（図中のＣ５５）、桁上げ情報のその他のビット位置に値０を記録する。
【００５０】
図２（ｂ）はニ数減算演算命令（ＳＵＢ命令）を実行した時の桁上げ情報を示し、演算結果におけるビット位置７からの桁上げがないときは値０の反転値ＦＦを、有るときは値０を桁上げ情報のビット位置８から１５に記録し（図中の上線を施したＣ７）、演算結果におけるビット位置１５からの桁上げがないときは値０の反転値ＦＦを、有るときは値０を桁上げ情報のビット位置１６から２３に記録し（図中の上線を施したＣ１５）、演算結果におけるビット位置２３からの桁上げがないときは値０の反転値ＦＦを、有るときは値０を桁上げ情報のビット位置２４から３１に記録し（図中の上線を施したＣ２３）、演算結果におけるビット位置３１からの桁上げがないときは値０の反転値ＦＦを、有るときは値０を桁上げ情報のビット位置３２から３９に記録し（図中の上線を施したＣ３１）、演算結果におけるビット位置３９からの桁上げがないときは値０の反転値ＦＦを、有るときは値０を桁上げ情報のビット位置４０から４７に記録し（図中の上線を施したＣ３９）、演算結果におけるビット位置４７からの桁上げがないときは値０の反転値ＦＦを、有るときは値０を桁上げ情報のビット位置４８から５５に記録し（図中の上線を施したＣ４７）、演算結果におけるビット位置５５からの桁上げがないときは値０の反転値ＦＦを、有るときは値０を桁上げ情報のビット位置５６から６３に記録し（図中の上線を施したＣ５５）、ビット位置０から７に値０を記録する。
【００５１】
図２（ｃ）は１加算演算命令（ＩＮＣ命令）を実行した時の桁上げ情報を示し、図２（ｂ）の場合と同様である。
図２（ｄ）は１減算演算命令（ＤＥＣ命令）を実行した時の桁上げ情報を示し、図２（ａ）の場合と同様である。
なお、ＳＵＢ命令およびＤＥＣ命令の実行時における桁上げとは、ＡＬＵ８においてＡ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現した場合の桁上げ（キャリ）を意味し、減算時のいわゆる桁下がり（ボロー）ではない。また、ここで反転とは値０を値１に、値１を値０にすることを意味する。
【００５２】
以下にSIMD演算装置の動作例を、マシンサイクルと呼ばれる動作タイミングに沿って、３つのステージ別に説明する。
＜動作例１＞
８ビットデータ同士を８個並列にニ数加算する８×８SIMDニ数加算演算の場合の動作例を説明する。
【００５３】
加算すべき一方の８ビットデータのそれぞれを８個連結した６４ビットデータをＤ０レジスタに格納し、同様に、加算すべきもう一方の８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMDニ数加算演算は以下の２つの命令を実行することにより実現される。
ADD D0,D1
SIMD8 D1
ここで、加算すべき一方の８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とし、加算すべきもう一方の８ビットデータを全て“0x80”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x8080808080808080”が予め格納されていることになる。
【００５４】
図３（ａ）は８×８SIMDニ数加算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＡＤＤ命令、
ニ数加算命令“ADD D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＡＤＤ命令、
ＩＲ２に格納されたニ数加算命令“ADD D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数加算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x8080808080808080”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＡＤＤ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x92B4D6F91B3D5F70”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=0, C47=0, C55=0であることから図３（ａ）に示すような桁上げ情報“0x0000000101010100”がＣＲ９に格納される。
【００５５】
0003779602.tif 000002
・ＤＥＣステージ：ＳＩＭＤ命令、ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x92B4D6F91B3D5F70”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0000000101010100”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x92B4D6F81A3C5E70”をＤ１レジスタに格納する。
【００５６】
0003779602.tif 000003
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数加算するSIMD演算結果となる。
【００５７】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000004
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【００５８】
＜動作例２＞
１６ビットデータ同士を４個並列にニ数加算する１６×４SIMDニ数加算演算の場合の動作例を説明する。
加算すべき一方の１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ０レジスタに格納し、同様に、加算すべきもう一方の１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMDニ数加算演算は以下の２つの命令を実行することにより実現される。
【００５９】
ADD D0,D1
SIMD16 D1
ここで、加算すべき一方の１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とし、加算すべきもう一方の１６ビットデータを全て“0x8080”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x8080808080808080”が予め格納されていることになる。
【００６０】
図３（ｂ）は１６×４SIMDニ数加算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＡＤＤ命令、
ニ数加算命令“ADD D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＡＤＤ命令、
ＩＲ２に格納されたニ数加算命令“ADD D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数加算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x8080808080808080”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＡＤＤ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x92B4D6F91B3D5F70”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=0, C47=0, C55=0であることから図３（ｂ）に示すような桁上げ情報“0x0000000101010100”がＣＲ９に格納される。
【００６１】
0003779602.tif 000005
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x92B4D6F91B3D5F70”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0000000101010100”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0x0000000100010000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x92B4D6F81B3C5F70”をＤ１レジスタに格納する。
【００６２】
0003779602.tif 000006
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ１６ビットデータ４個とし、対応する１６ビットデータ同志をニ数加算するSIMD演算結果となる。
【００６３】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000007
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【００６４】
＜動作例３＞
３２ビットデータ同士を２個並列にニ数加算する３２×２SIMDニ数加算演算の場合の動作例を説明する。
加算すべき一方の３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ０レジスタに格納し、同様に、加算すべきもう一方の３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMDニ数加算演算は以下の２つの命令を実行することにより実現される。
【００６５】
ADD D0,D1
SIMD32 D1
ここで、加算すべき一方の３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とし、加算すべきもう一方の３２ビットデータを全て“0x80808080”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x8080808080808080”が予め格納されていることになる。
【００６６】
図３（ｃ）は３２×２SIMDニ数加算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＡＤＤ命令、
ニ数加算命令“ADD D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＡＤＤ命令、
ＩＲ２に格納されたニ数加算命令“ADD D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの加算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x8080808080808080”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD32 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＡＤＤ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x92B4D6F91B3D5F70”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=0, C47=0, C55=0であることから図３（ｃ）に示すような桁上げ情報“0x0000000101010100”がＣＲ９に格納される。
【００６７】
0003779602.tif 000008
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD32 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x92B4D6F91B3D5F70”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0000000101010100”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0x0000000100000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して３２ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x92B4D6F81B3D5F70”をＤ１レジスタに格納する。
【００６８】
0003779602.tif 000009
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ３２ビットデータ２個とし、対応する３２ビットデータ同志をニ数加算するSIMD演算結果となる。
【００６９】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000010
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【００７０】
＜動作例４＞
８ビットデータから８ビットデータを８個並列にニ数減算する８×８SIMDニ数減算演算の場合の動作例を説明する。
減算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ０レジスタに格納し、同様に、減算すべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMDニ数減算演算は以下の２つの命令を実行することにより実現される。
【００７１】
SUB D0,D1
SIMD8 D1
ここで、減算されるべき８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とし、減算すべき８ビットデータを全て“0x70”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x7070707070707070”が予め格納されていることになる。
【００７２】
図４（ａ）は８×８SIMDニ数減算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＳＵＢ命令、
ニ数減算命令“SUB D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＳＵＢ命令、
ＩＲ２に格納されたニ数減算命令“SUB D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数減算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x7070707070707070”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＳＵＢ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力からＢ入力を減算する６４ビット桁上げ伝播減算が行われ、演算結果“0xA1C3E6082A4C6E80”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=0, C55=0であることから図４（ａ）に示すような桁上げ情報“0xFFFF000000000000”がＣＲ９に格納される。
【００７３】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x7070707070707070”をビット反転し＋１した“0x8F8F8F8F8F8F8F90”（２の補数）をＡ入力に加算する。
0003779602.tif 000011
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0xA1C3E6082A4C6E80”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFF000000000000”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0xA2C4E6082A4C6E80”をＤ１レジスタに格納する。
【００７４】
0003779602.tif 000012
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数減算するSIMD演算結果となる。
【００７５】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000013
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【００７６】
＜動作例５＞
１６ビットデータから１６ビットデータを４個並列にニ数減算する１６×４SIMDニ数減算演算の場合の動作例を説明する。
減算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ０レジスタに格納し、同様に、減算すべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMDニ数減算演算は以下の２つの命令を実行することにより実現される。
【００７７】
SUB D0,D1
SIMD16 D1
ここで、減算されるべき１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とし、減算すべき１６ビットデータを全て“0x7070”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x7070707070707070”が予め格納されていることになる。
【００７８】
図４（ｂ）は１６×４SIMDニ数減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＳＵＢ命令、
ニ数減算命令“SUB D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＳＵＢ命令、
ＩＲ２に格納されたニ数減算命令“SUB D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数減算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x7070707070707070”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＳＵＢ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力からＢ入力を減算する６４ビット桁上げ伝播減算が行われ、演算結果“0xA1C3E6082A4C6E80”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=0, C55=0であることから図４（ｂ）に示すような桁上げ情報“0xFFFF000000000000”がＣＲ９に格納される。
【００７９】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x7070707070707070”をビット反転し＋１した“0x8F8F8F8F8F8F8F90”（２の補数）をＡ入力に加算する。
0003779602.tif 000014
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0xA1C3E6082A4C6E80”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFF000000000000”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0xFFFF000000000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0xA1C4E6082A4C6E80”をＤ１レジスタに格納する。
【００８０】
0003779602.tif 000015
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数減算するSIMD演算結果となる。
【００８１】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000016
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【００８２】
＜動作例６＞
３２ビットデータから３２ビットデータを２個並列にニ数減算する３２×２SIMDニ数減算演算の場合の動作例を説明する。
減算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ０レジスタに格納し、同様に、減算すべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMDニ数減算演算は以下の２つの命令を実行することにより実現される。
【００８３】
SUB D0,D1
SIMD32 D1
ここで、減算されるべき３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とし、減算すべき３２ビットデータを全て“0x70707070”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x7070707070707070”が予め格納されていることになる。
【００８４】
図４（ｃ）は３２×２SIMDニ数減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＳＵＢ命令、
ニ数減算命令“SUB D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＳＵＢ命令、
ＩＲ２に格納されたニ数減算命令“SUB D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数減算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x7070707070707070”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD32 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＳＵＢ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力からＢ入力を減算する６４ビット桁上げ伝播減算が行われ、演算結果“0xA1C3E6082A4C6E80”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=0, C55=0であることから図４（ｃ）に示すような桁上げ情報“0xFFFF000000000000”がＣＲ９に格納される。
【００８５】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x7070707070707070”をビット反転し＋１した“0x8F8F8F8F8F8F8F90”（２の補数）をＡ入力に加算する。
0003779602.tif 000017
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD32 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0xA1C3E6082A4C6E80”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFF000000000000”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0x0000000000000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して３２ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0xA1C3E6082A4C6E80”をＤ１レジスタに格納する。
【００８６】
0003779602.tif 000018
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数減算するSIMD演算結果となる。
【００８７】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000019
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【００８８】
＜動作例７＞
８ビットデータを８個並列に１加算する８×８SIMD１加算演算の場合の動作例を説明する。
１加算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１加算演算は以下の２つの命令を実行することにより実現される。
【００８９】
INC D1
SIMD8 D1
ここで、１加算されるべき８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【００９０】
図５（ａ）は８×８SIMD１加算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＩＮＣ命令、
１加算命令“INC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＩＮＣ命令、
ＩＲ２に格納された１加算命令“INC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１加算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＩＮＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x123456789ABCDEF1”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=0, C15=0, C23=0, C31=0, C39=0, C47=0, C55=0であることから図５（ａ）に示すような桁上げ情報“0xFFFFFFFFFFFFFF00”がＣＲ９に格納される。
【００９１】
0003779602.tif 000020
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEF1”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFFFFFFFFFFFF00”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x133557799BBDDFF1”をＤ１レジスタに格納する。
【００９２】
0003779602.tif 000021
この演算結果は、Ｄ０レジスタに予め格納されていた内容を８ビットデータ８個とし、それぞれの８ビットデータを１加算するSIMD演算結果となる。
【００９３】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000022
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【００９４】
なお、１加算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１加算演算は以下の２つの命令を実行することによっても実現される。
MOV 0xFFFFFFFFFFFFFFFF,CR
SIMD8 D1
ここで“MOV 0xFFFFFFFFFFFFFFFF,CR”は、ＣＲ９に“0xFFFFFFFFFFFFFFFF”を格納する命令である。
【００９５】
＜動作例８＞
１６ビットデータを４個並列に１加算する１６×４SIMD１加算演算の場合の動作例を説明する。
１加算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１加算演算は以下の２つの命令を実行することにより実現される。
【００９６】
INC D1
SIMD16 D1
ここで、１加算されるべき１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【００９７】
図５（ｂ）は１６×４SIMD１加算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＩＮＣ命令、
１加算命令“INC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＩＮＣ命令、
ＩＲ２に格納された１加算命令“INC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１加算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＩＮＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x123456789ABCDEF1”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=0, C15=0, C23=0, C31=0, C39=0, C47=0, C55=0であることから図５（ｂ）に示すような桁上げ情報“0xFFFFFFFFFFFFFF00”がＣＲ９に格納される。
【００９８】
0003779602.tif 000023
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEF1”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFFFFFFFFFFFF00”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0xFFFFFFFFFFFF0000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x123556799ABDDEF1”をＤ１レジスタに格納する。
【００９９】
0003779602.tif 000024
この演算結果は、Ｄ０レジスタに予め格納されていた内容を１６ビットデータ４個とし、それぞれの１６ビットデータを１加算するSIMD演算結果となる。
【０１００】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000025
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１０１】
なお、１加算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１加算演算は以下の２つの命令を実行することによっても実現される。
MOV 0xFFFFFFFFFFFFFFFF,CR
SIMD16 D1
ここで“MOV 0xFFFFFFFFFFFFFFFF,CR”は、ＣＲ９に“0xFFFFFFFFFFFFFFFF”を格納する命令である。
【０１０２】
＜動作例９＞
３２ビットデータを２個並列に１加算する３２×２SIMD１加算演算の場合の動作例を説明する。
１加算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１加算演算は以下の２つの命令を実行することにより実現される。
【０１０３】
INC D1
SIMD32 D1
ここで、１加算されるべき３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１０４】
図５（ｃ）は３２×２SIMD１加算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＩＮＣ命令、
１加算命令“INC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＩＮＣ命令、
ＩＲ２に格納された１加算命令“INC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１加算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＩＮＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x123456789ABCDEF1”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=0, C15=0, C23=0, C31=0, C39=0, C47=0, C55=0であることから図５（ｃ）に示すような桁上げ情報“0xFFFFFFFFFFFFFF00”がＣＲ９に格納される。
【０１０５】
0003779602.tif 000026
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEF1”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFFFFFFFFFFFF00”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0xFFFFFFFF00000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x123456799ABCDEF1”をＤ１レジスタに格納する。
【０１０６】
0003779602.tif 000027
この演算結果は、Ｄ０レジスタに予め格納されていた内容を３２ビットデータ２個とし、それぞれの３２ビットデータを１加算するSIMD演算結果となる。
【０１０７】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000028
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１０８】
なお、１加算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１加算演算は以下の２つの命令を実行することによっても実現される。
MOV 0xFFFFFFFFFFFFFFFF,CR
SIMD32 D1
ここで“MOV 0xFFFFFFFFFFFFFFFF,CR”は、ＣＲ９に“0xFFFFFFFFFFFFFFFF”を格納する命令である。
【０１０９】
＜動作例１０＞
８ビットデータを８個並列に１減算する８×８SIMD１減算演算の場合の動作例を説明する。
１減算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１減算演算は以下の２つの命令を実行することにより実現される。
【０１１０】
DEC D1
SIMD8 D1
ここで、１減算されるべき８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１１１】
図６（ａ）は８×８SIMD１減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＤＥＣ命令、
１減算命令“DEC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＤＥＣ命令、
ＩＲ２に格納された１減算命令“DEC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１減算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＤＥＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播減算が行われ、演算結果“0x123456789ABCDEEF”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=1, C55=1であることから図６（ａ）に示すような桁上げ情報“0x0101010101010100”がＣＲ９に格納される。
【０１１２】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x0000000000000001”をビット反転し＋１した“0xFFFFFFFFFFFFFFFF”（２の補数）をＡ入力に加算する。
0003779602.tif 000029
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEEF”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101010101010100”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x1133557799BBDDEF”をＤ１レジスタに格納する。
【０１１３】
0003779602.tif 000030
この演算結果は、Ｄ０レジスタに予め格納されていた内容を８ビットデータ８個とし、それぞれの８ビットデータを１減算するSIMD演算結果となる。
【０１１４】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000031
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１１５】
なお、１加算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１減算演算は以下の２つの命令を実行することによっても実現される。
MOV 0x0101010101010101,CR
SIMD8 D1
ここで“MOV 0x0101010101010101,CR”は、ＣＲ９に“0x0101010101010101”を格納する命令である。
【０１１６】
＜動作例１１＞
１６ビットデータを４個並列に１減算する１６×４SIMD１減算演算の場合の動作例を説明する。
１減算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１減算演算は以下の２つの命令を実行することにより実現される。
【０１１７】
DEC D1
SIMD16 D1
ここで、１減算されるべき１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１１８】
図６（ｂ）は１６×４SIMD１減算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＤＥＣ命令、
１減算命令“DEC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＤＥＣ命令、
ＩＲ２に格納された１減算命令“DEC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１減算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＤＥＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播減算が行われ、演算結果“0x123456789ABCDEEF”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=1, C55=1であることから図６（ｂ）に示すような桁上げ情報“0x0101010101010100”がＣＲ９に格納される。
【０１１９】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x0000000000000001”をビット反転し＋１した“0xFFFFFFFFFFFFFFFF”（２の補数）をＡ入力に加算する。
0003779602.tif 000032
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEEF”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101010101010100”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0x0001000100010000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x123356779ABBDEEF”をＤ１レジスタに格納する。
【０１２０】
0003779602.tif 000033
この演算結果は、Ｄ０レジスタに予め格納されていた内容を１６ビットデータ４個とし、それぞれの１６ビットデータを１減算するSIMD演算結果となる。
【０１２１】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000034
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１２２】
なお、１加算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１減算演算は以下の２つの命令を実行することによっても実現される。
MOV 0x0101010101010101,CR
SIMD16 D1
ここで“MOV 0x0101010101010101,CR”は、ＣＲ９に“0x0101010101010101”を格納する命令である。
【０１２３】
＜動作例１２＞
３２ビットデータを２個並列に１減算する３２×２SIMD１減算演算の場合の動作例を説明する。
１減算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１減算演算は以下の２つの命令を実行することにより実現される。
【０１２４】
DEC D1
SIMD32 D1
ここで、１減算されるべき３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１２５】
図６（ｃ）は３２×２SIMD１減算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＤＥＣ命令、
１減算命令“DEC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＤＥＣ命令、
ＩＲ２に格納された１減算命令“DEC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１減算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD32 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＤＥＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播減算が行われ、演算結果“0x123456789ABCDEEF”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=1, C55=1であることから図６（ｃ）に示すような桁上げ情報“0x0101010101010100”がＣＲ９に格納される。
【０１２６】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x0000000000000001”をビット反転し＋１した“0xFFFFFFFFFFFFFFFF”（２の補数）をＡ入力に加算する。
0003779602.tif 000035
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD32 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEEF”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101010101010100”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0x0000000100000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ８において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して３２ビット単位にのみ桁上げが伝播する減算演算を行い、演算結果“0x123456779ABCDEEF”をＤ１レジスタに格納する。
【０１２７】
0003779602.tif 000036
この演算結果は、Ｄ０レジスタに予め格納されていた内容を３２ビットデータ２個とし、それぞれの３２ビットデータを１減算するSIMD演算結果となる。
【０１２８】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000037
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１２９】
なお、１加算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１減算演算は以下の２つの命令を実行することによっても実現される。
MOV 0x0101010101010101,CR
SIMD32 D1
ここで“MOV 0x0101010101010101,CR”は、ＣＲ９に“0x0101010101010101”を格納する命令である。
【０１３０】
以上のように、本発明の実施の形態１のプロセッサは、演算の種別数によらないSIMD8、SIMD16及びSIMD32というデータ幅の種別数によるSIMD補正命令を従来の命令に追加して実装するだけで複数の演算の種別に対するSIMD演算を実行することができるので、命令数の増加を飛躍的に抑えることができる。
（実施の形態２）
＜概要＞
上記の実施の形態１では、SIMD補正命令の実行の際に減算による補正を行っているが、本発明の実施の形態２は、加算による補正を行う。
【０１３１】
以下に、SIMD補正命令の実行の際に加算による補正を行う場合について説明する。
＜構成＞
図７は、本実施の形態２に係るSIMD演算装置の構成を示す図である。
図７に示すSIMD演算装置２０の構成は、実施の形態１で説明したSIMD演算装置１０が備えるＡＬＵ８がＡＬＵ２１に置き換わったものである。なお、SIMD演算装置１０と同様の構成要素には同一符号を付し、それらの説明を省略する。
【０１３２】
ＡＬＵ２１は６４ビット幅の加減算器であり、ＡＲ６の内容とＢＲ７の内容とをそれぞれＡ入力とＢ入力として、演算命令実行時にはＡ＋Ｂの加算又はＡ−Ｂの減算を行い演算結果をレジスタに保持させると共に、並列演算の対象とするデータサイズの最小単位である８ビット毎の桁上げの結果を示す桁上げ情報を生成してＣＲ９に保持させ、また、SIMD補正命令実行時には他のSIMD演算結果に影響を及ばさないようにＡ＋Ｂの加算を行い当該演算結果を各SIMD演算結果に補正する。
【０１３３】
ここではＡＬＵ２１は、ニ数加算命令“ADD D0,D1”及び１加算命令“INC D1”を実行する場合にはＡ＋Ｂの加算を行い演算結果を得てＤ１レジスタに保持させると共に、ニ数加算命令では８ビット毎に桁上げが無い場合は０を示し桁上げが有る場合は−１を示す桁上げ情報を生成し、１加算命令では８ビット毎に桁上げが無い場合は１を示し桁上げが有る場合は０を示す桁上げ情報を生成し、また、ニ数減算命令“SUB D0,D1”及び１減算命令“DEC D1”を実行する場合にはＡ−Ｂの減算を行い演算結果を得ると共に、ニ数減算命令では８ビット毎に桁上げが無い場合は１を示し桁上げが有る場合は０を示す桁上げ情報を生成し、１減算命令では、８ビット毎に桁上げが無い場合は０を示し桁上げが有る場合は−１を示す桁上げ情報を生成する。さらにＡＬＵ８は、８ビットSIMD補正命令“SIMD8 D1”、１６ビットSIMD補正命令“SIMD16 D1”及び３２ビットSIMD補正命令“SIMD32 D1”を実行する場合には、対応するビット数毎に他に影響を及ばさないようにＡ＋Ｂの加算を行い、Ｄ１レジスタに保持していた演算結果を各SIMD演算結果に補正してＤ１レジスタに保持させる。
【０１３４】
ここで、機械語命令をＲＯＭ１からフェッチし命令レジスタ２へ書込む処理はＩＦステージで行われ、ＤＥＣ３における機械語命令の解読とＥＸＴ５符号拡張とレジスタファイル４又はＥＸＴ５からの出力とはＤＥＣステージで行われ、ＡＬＵ２１における演算とＣＲ９への桁上げ情報の保持はＥＸステージで行われる。
【０１３５】
＜動作＞
図８（ａ）〜（ｄ）は、ＣＲ９に保持される桁上げ情報のビット構成の一例を示す図である。
図８の各図において、横軸方向に付された“６３，５６，５５，４８，４７，４０，３９，３２，３１，２４，２３，１６，１５，８，７，０”の数字はビット位置を表し、ビット位置０はＬＳＢ（最下位ビット）を、ビット位置６３はＭＳＢ（最上位ビット）を意味する。
【０１３６】
図８（ａ）はニ数加算演算命令（ＡＤＤ命令）を実行した時の桁上げ情報を示し、演算結果におけるビット位置７からの桁上げがないときは値０を、有るときは値０の反転値ＦＦを桁上げ情報のビット位置８に記録し（図中のＣ７）、演算結果におけるビット位置１５からの桁上げがないときは値０を、有るときは値０の反転値ＦＦを桁上げ情報のビット位置１６に記録し（図中のＣ１５）、演算結果におけるビット位置２３からの桁上げがないときは値０を、有るときは値０の反転値ＦＦを桁上げ情報のビット位置２４に記録し（図中のＣ２３）、演算結果におけるビット位置３１からの桁上げがないときは値０を、有るときは値０の反転値ＦＦを桁上げ情報のビット位置３２に記録し（図中のＣ３１）、演算結果におけるビット位置３９からの桁上げがないときは値０を、有るときは値０の反転値ＦＦを桁上げ情報のビット位置４０に記録し（図中のＣ３９）、演算結果におけるビット位置４７からの桁上げがないときは値０を、有るときは値０の反転値ＦＦを桁上げ情報のビット位置４８に記録し（図中のＣ４７）、演算結果におけるビット位置５５からの桁上げがないときは値０を、有るときは値０の反転値ＦＦを桁上げ情報のビット位置５６に記録し（図中のＣ５５）、ビット位置０から７に値０を記録する。
【０１３７】
図８（ｂ）はニ数減算演算命令（ＳＵＢ命令）を実行した時の桁上げ情報を示し、演算結果におけるビット位置７からの桁上げがないときは値１を、有るときは値０を桁上げ情報のビット位置８に記録し（図中の上線を施したＣ７）、演算結果におけるビット位置１５からの桁上げがないときは値１を、有るときは値０を桁上げ情報のビット位置１６に記録し（図中の上線を施したＣ１５）、演算結果におけるビット位置２３からの桁上げがないときは値１を、有るときは値０を桁上げ情報のビット位置２４に記録し（図中の上線を施したＣ２３）、演算結果におけるビット位置３１からの桁上げがないときは値１を、有るときは値０を桁上げ情報のビット位置３２に記録し（図中の上線を施したＣ３１）、演算結果におけるビット位置３９からの桁上げがないときは値１を、有るときは値０を桁上げ情報のビット位置４０に記録し（図中の上線を施したＣ３９）、演算結果におけるビット位置４７からの桁上げがないときは値１を、有るときは値０を桁上げ情報のビット位置４８に記録し（図中の上線を施したＣ４７）、演算結果におけるビット位置５５からの桁上げがないときは値１を、有るときは値０を桁上げ情報のビット位置５６に記録し（図中の上線を施したＣ５５）、桁上げ情報のその他のビット位置に値０を記録する。
【０１３８】
図８（ｃ）は１加算演算命令（ＩＮＣ命令）を実行した時の桁上げ情報を示し、図８（ｂ）の場合と同様である。
図８（ｄ）は１減算演算命令（ＤＥＣ命令）を実行した時の桁上げ情報を示し、図８（ａ）の場合と同様である。
＜動作例１＞
８ビットデータ同士を８個並列にニ数加算する８×８SIMDニ数加算演算の場合の動作例を説明する。
【０１３９】
加算すべき一方の８ビットデータのそれぞれを８個連結した６４ビットデータをＤ０レジスタに格納し、同様に、加算すべきもう一方の８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMDニ数加算演算は以下の２つの命令を実行することにより実現される。
ADD D0,D1
SIMD8 D1
ここで、加算すべき一方の８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とし、加算すべきもう一方の８ビットデータを全て“0x80”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x8080808080808080”が予め格納されていることになる。
【０１４０】
図９（ａ）は８×８SIMDニ数加算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＡＤＤ命令、
ニ数加算命令“ADD D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＡＤＤ命令、
ＩＲ２に格納されたニ数加算命令“ADD D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数加算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x8080808080808080”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＡＤＤ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x92B4D6F91B3D5F70”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=0, C47=0, C55=0であることから図９（ａ）に示すような桁上げ情報“0x000000FFFFFFFF00”がＣＲ９に格納される。
【０１４１】
0003779602.tif 000038
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x92B4D6F91B3D5F70”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x000000FFFFFFFF00”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x92B4D6F81A3C5E70”をＤ１レジスタに格納する。
【０１４２】
0003779602.tif 000039
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数加算するSIMD演算結果となる。
【０１４３】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000040
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１４４】
＜動作例２＞
１６ビットデータ同士を４個並列にニ数加算する１６×４SIMDニ数加算演算の場合の動作例を説明する。
加算すべき一方の１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ０レジスタに格納し、同様に、加算すべきもう一方の１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMDニ数加算演算は以下の２つの命令を実行することにより実現される。
【０１４５】
ADD D0,D1
SIMD16 D1
ここで、加算すべき一方の１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とし、加算すべきもう一方の１６ビットデータを全て“0x8080”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x8080808080808080”が予め格納されていることになる。
【０１４６】
図９（ｂ）は１６×４SIMDニ数加算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＡＤＤ命令、
ニ数加算命令“ADD D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＡＤＤ命令、
ＩＲ２に格納されたニ数加算命令“ADD D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数加算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x8080808080808080”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＡＤＤ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x92B4D6F91B3D5F70”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=0, C47=0, C55=0であることから図９（ｂ）に示すような桁上げ情報“0x000000FFFFFFFF00”がＣＲ９に格納される。
【０１４７】
0003779602.tif 000041
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x92B4D6F91B3D5F70”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x000000FFFFFFFF00”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0x0000FFFFFFFF0000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x92B4D6F81B3C5F70”をＤ１レジスタに格納する。
【０１４８】
0003779602.tif 000042
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ１６ビットデータ４個とし、対応する１６ビットデータ同志をニ数加算するSIMD演算結果となる。
【０１４９】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000043
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１５０】
＜動作例３＞
３２ビットデータ同士を２個並列にニ数加算する３２×２SIMDニ数加算演算の場合の動作例を説明する。
加算すべき一方の３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ０レジスタに格納し、同様に、加算すべきもう一方の３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMDニ数加算演算は以下の２つの命令を実行することにより実現される。
【０１５１】
ADD D0,D1
SIMD32 D1
ここで、加算すべき一方の３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とし、加算すべきもう一方の３２ビットデータを全て“0x80808080”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x8080808080808080”が予め格納されていることになる。
【０１５２】
図９（ｃ）は３２×２SIMDニ数加算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＡＤＤ命令、
ニ数加算命令“ADD D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＡＤＤ命令、
ＩＲ２に格納されたニ数加算命令“ADD D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数加算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x8080808080808080”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD32 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＡＤＤ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x92B4D6F91B3D5F70”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=0, C47=0, C55=0であることから図９（ｃ）に示すような桁上げ情報“0x000000FFFFFFFF00”がＣＲ９に格納される。
【０１５３】
0003779602.tif 000044
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD32 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x92B4D6F91B3D5F70”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x000000FFFFFFFF00”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0xFFFFFFFF00000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して３２ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x92B4D6F81B3D5F70”をＤ１レジスタに格納する。
【０１５４】
0003779602.tif 000045
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ３２ビットデータ２個とし、対応する３２ビットデータ同志をニ数加算するSIMD演算結果となる。
【０１５５】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000046
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１５６】
＜動作例４＞
８ビットデータから８ビットデータを８個並列にニ数減算する８×８SIMDニ数減算演算の場合の動作例を説明する。
減算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ０レジスタに格納し、同様に、減算すべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMDニ数減算演算は以下の２つの命令を実行することにより実現される。
【０１５７】
SUB D0,D1
SIMD8 D1
ここで、減算されるべき８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とし、減算すべき８ビットデータを全て“0x70”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x7070707070707070”が予め格納されていることになる。
【０１５８】
図１０（ａ）は８×８SIMDニ数減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＳＵＢ命令、
ニ数減算命令“SUB D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＳＵＢ命令、
ＩＲ２に格納されたニ数減算命令“SUB D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数減算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x7070707070707070”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＳＵＢ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力からＢ入力を減算する６４ビット桁上げ伝播減算が行われ、演算結果“0xA1C3E6082A4C6E80”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=0, C55=0であることから図１０（ａ）に示すような桁上げ情報“0x0101000000000000”がＣＲ９に格納される。
【０１５９】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x7070707070707070”をビット反転し＋１した“0x8F8F8F8F8F8F8F90”（２の補数）をＡ入力に加算する。
0003779602.tif 000047
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0xA1C3E6082A4C6E80”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101000000000000”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0xA2C4E6082A4C6E80”をＤ１レジスタに格納する。
【０１６０】
0003779602.tif 000048
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数減算するSIMD演算結果となる。
【０１６１】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000049
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１６２】
＜動作例５＞
１６ビットデータから１６ビットデータを４個並列にニ数減算する１６×４SIMDニ数減算演算の場合の動作例を説明する。
減算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ０レジスタに格納し、同様に、減算すべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMDニ数減算演算は以下の２つの命令を実行することにより実現される。
【０１６３】
SUB D0,D1
SIMD16 D1
ここで、減算されるべき１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とし、減算すべき１６ビットデータを全て“0x7070”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x7070707070707070”が予め格納されていることになる。
【０１６４】
図１０（ｂ）は１６×４SIMDニ数減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＳＵＢ命令、
ニ数減算命令“SUB D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＳＵＢ命令、
ＩＲ２に格納されたニ数減算命令“SUB D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数減算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x7070707070707070”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＳＵＢ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力からＢ入力を減算する６４ビット桁上げ伝播減算が行われ、演算結果“0xA1C3E6082A4C6E80”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=0, C55=0であることから図１０（ｂ）に示すような桁上げ情報“0x0101000000000000”がＣＲ９に格納される。
【０１６５】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x7070707070707070”をビット反転し＋１した“0x8F8F8F8F8F8F8F90”（２の補数）をＡ入力に加算する。
0003779602.tif 000050
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0xA1C3E6082A4C6E80”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101000000000000”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0x0001000000000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0xA1C4E6082A4C6E80”をＤ１レジスタに格納する。
【０１６６】
0003779602.tif 000051
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数減算するSIMD演算結果となる。
【０１６７】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000052
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１６８】
＜動作例６＞
３２ビットデータから３２ビットデータを２個並列にニ数減算する３２×２SIMDニ数減算演算の場合の動作例を説明する。
減算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ０レジスタに格納し、同様に、減算すべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMDニ数減算演算は以下の２つの命令を実行することにより実現される。
【０１６９】
SUB D0,D1
SIMD32 D1
ここで、減算されるべき３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とし、減算すべき３２ビットデータを全て“0x70707070”とすると、Ｄ０レジスタには“0x123456789ABCDEF0”、Ｄ１レジスタには“0x7070707070707070”が予め格納されていることになる。
【０１７０】
図１０（ｃ）は３２×２SIMDニ数減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＳＵＢ命令、
ニ数減算命令“SUB D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＳＵＢ命令、
ＩＲ２に格納されたニ数減算命令“SUB D0,D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータのニ数減算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、またＤ１レジスタの内容“0x7070707070707070”が読み出されＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD32 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＳＵＢ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力からＢ入力を減算する６４ビット桁上げ伝播減算が行われ、演算結果“0xA1C3E6082A4C6E80”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=0, C55=0であることから図１０（ｃ）に示すような桁上げ情報“0x0101000000000000”がＣＲ９に格納される。
【０１７１】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x7070707070707070”をビット反転し＋１した“0x8F8F8F8F8F8F8F90”（２の補数）をＡ入力に加算する。
0003779602.tif 000053
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD32 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0xA1C3E6082A4C6E80”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101000000000000”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0x0000000000000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して３２ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0xA1C3E6082A4C6E80”をＤ１レジスタに格納する。
【０１７２】
0003779602.tif 000054
この演算結果は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ８個とし、対応する８ビットデータ同志をニ数減算するSIMD演算結果となる。
【０１７３】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000055
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１７４】
＜動作例７＞
８ビットデータを８個並列に１加算する８×８SIMD１加算演算の場合の動作例を説明する。
１加算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１加算演算は以下の２つの命令を実行することにより実現される。
【０１７５】
INC D1
SIMD8 D1
ここで、１加算されるべき８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１７６】
図１１（ａ）は８×８SIMD１加算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＩＮＣ命令、
１加算命令“INC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＩＮＣ命令、
ＩＲ２に格納された１加算命令“INC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１加算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＩＮＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x123456789ABCDEF1”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=0, C15=0, C23=0, C31=0, C39=0, C47=0, C55=0であることから図１１（ａ）に示すような桁上げ情報“0x0101010101010100”がＣＲ９に格納される。
【０１７７】
0003779602.tif 000056
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEF1”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101010101010100”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x133557799BBDDFF1”をＤ１レジスタに格納する。
【０１７８】
0003779602.tif 000057
この演算結果は、Ｄ０レジスタに予め格納されていた内容を８ビットデータ８個とし、それぞれの８ビットデータを１加算するSIMD演算結果となる。
【０１７９】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000058
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１８０】
なお、１加算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１加算演算は以下の２つの命令を実行することによっても実現される。
MOV 0x0101010101010101,CR
SIMD8 D1
ここで“MOV 0x0101010101010101,CR”は、ＣＲ９に“0x0101010101010101”を格納する命令である。
【０１８１】
＜動作例８＞
１６ビットデータを４個並列に１加算する１６×４SIMD１加算演算の場合の動作例を説明する。
１加算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１加算演算は以下の２つの命令を実行することにより実現される。
【０１８２】
INC D1
SIMD16 D1
ここで、１加算されるべき１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１８３】
図１１（ｂ）は１６×４SIMD１加算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＩＮＣ命令、
１加算命令“INC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＩＮＣ命令、
ＩＲ２に格納された１加算命令“INC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１加算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＩＮＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x123456789ABCDEF1”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=0, C15=0, C23=0, C31=0, C39=0, C47=0, C55=0であることから図１１（ｂ）に示すような桁上げ情報“0x0101010101010100”がＣＲ９に格納される。
【０１８４】
0003779602.tif 000059
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEF1”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101010101010100”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0x0001000100010000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x123556799ABDDEF1”をＤ１レジスタに格納する。
【０１８５】
0003779602.tif 000060
この演算結果は、Ｄ０レジスタに予め格納されていた内容を１６ビットデータ４個とし、それぞれの１６ビットデータを１加算するSIMD演算結果となる。
【０１８６】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000061
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１８７】
なお、１加算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１加算演算は以下の２つの命令を実行することによっても実現される。
MOV 0x0101010101010101,CR
SIMD16 D1
ここで“MOV 0x0101010101010101,CR”は、ＣＲ９に“0x0101010101010101”を格納する命令である。
【０１８８】
＜動作例９＞
３２ビットデータを２個並列に１加算する３２×２SIMD１加算演算の場合の動作例を説明する。
１加算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１加算演算は以下の２つの命令を実行することにより実現される。
【０１８９】
INC D1
SIMD32 D1
ここで、１加算されるべき３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１９０】
図１１（ｃ）は３２×２SIMD１加算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＩＮＣ命令、
１加算命令“INC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＩＮＣ命令、
ＩＲ２に格納された１加算命令“INC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１加算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＩＮＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播加算が行われ、演算結果“0x123456789ABCDEF1”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=0, C15=0, C23=0, C31=0, C39=0, C47=0, C55=0であることから図１１（ｃ）に示すような桁上げ情報“0x0101010101010100”がＣＲ９に格納される。
【０１９１】
0003779602.tif 000062
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEF1”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0x0101010101010100”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0x0000000100000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x123456799ABCDEF1”をＤ１レジスタに格納する。
【０１９２】
0003779602.tif 000063
この演算結果は、Ｄ０レジスタに予め格納されていた内容を３２ビットデータ２個とし、それぞれの３２ビットデータを１加算するSIMD演算結果となる。
【０１９３】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000064
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０１９４】
なお、１加算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１加算演算は以下の２つの命令を実行することによっても実現される。
MOV 0x0101010101010101,CR
SIMD32 D1
ここで“MOV 0x0101010101010101,CR”は、ＣＲ９に“0x0101010101010101”を格納する命令である。
【０１９５】
＜動作例１０＞
８ビットデータを８個並列に１減算する８×８SIMD１減算演算の場合の動作例を説明する。
１減算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１減算演算は以下の２つの命令を実行することにより実現される。
【０１９６】
DEC D1
SIMD8 D1
ここで、１減算されるべき８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”、“0x9A”、“0xBC”、“0xDE”、“0xF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０１９７】
図１２（ａ）は８×８SIMD１減算演算時の各レジスタの内容を示す図である。（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＤＥＣ命令、
１減算命令“DEC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＤＥＣ命令、
ＩＲ２に格納された１減算命令“DEC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１減算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＤＥＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播減算が行われ、演算結果“0x123456789ABCDEEF”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=1, C55=1であることから図１２（ａ）に示すような桁上げ情報“0xFFFFFFFFFFFFFF00”がＣＲ９に格納される。
【０１９８】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x0000000000000001”をビット反転し＋１した“0xFFFFFFFFFFFFFFFF”（２の補数）をＡ入力に加算する。
0003779602.tif 000065
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３により解読される。解読された結果として８ビットデータの８並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEEF”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFFFFFFFFFFFF00”が読み出され、ＥＸＴ５による符号拡張は行われずにＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して８ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x1133557799BBDDEF”をＤ１レジスタに格納する。
【０１９９】
0003779602.tif 000066
この演算結果は、Ｄ０レジスタに予め格納されていた内容を８ビットデータ８個とし、それぞれの８ビットデータを１減算するSIMD演算結果となる。
【０２００】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000067
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０２０１】
なお、１加算されるべき８ビットデータのそれぞれを８個連結した６４ビットデータをＤ１レジスタに格納している場合には、８×８SIMD１減算演算は以下の２つの命令を実行することによっても実現される。
MOV 0xFFFFFFFFFFFFFFFF,CR
SIMD8 D1
ここで“MOV 0xFFFFFFFFFFFFFFFF,CR”は、ＣＲ９に“0xFFFFFFFFFFFFFFFF”を格納する命令である。
【０２０２】
＜動作例１１＞
１６ビットデータを４個並列に１減算する１６×４SIMD１減算演算の場合の動作例を説明する。
１減算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１減算演算は以下の２つの命令を実行することにより実現される。
【０２０３】
DEC D1
SIMD16 D1
ここで、１減算されるべき１６ビットデータのそれぞれを“0x1234”、“0x5678”、“0x9ABC”、“0xDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０２０４】
図１２（ｂ）は１６×４SIMD１減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＤＥＣ命令、
１減算命令“DEC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＤＥＣ命令、
ＩＲ２に格納された１減算命令“DEC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１減算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＤＥＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播減算が行われ、演算結果“0x123456789ABCDEEF”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=1, C55=1であることから図１２（ｂ）に示すような桁上げ情報“0xFFFFFFFFFFFFFF00”がＣＲ９に格納される。
【０２０５】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x0000000000000001”をビット反転し＋１した“0xFFFFFFFFFFFFFFFF”（２の補数）をＡ入力に加算する。
0003779602.tif 000068
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３により解読される。解読された結果として１６ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEEF”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFFFFFFFFFFFF00”が読み出され、ＥＸＴ５による１６ビット符号拡張が行われて“0xFFFFFFFFFFFF0000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して１６ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x123356779ABBDEEF”をＤ１レジスタに格納する。
【０２０６】
0003779602.tif 000069
この演算結果は、Ｄ０レジスタに予め格納されていた内容を１６ビットデータ４個とし、それぞれの１６ビットデータを１減算するSIMD演算結果となる。
【０２０７】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000070
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０２０８】
なお、１加算されるべき１６ビットデータのそれぞれを４個連結した６４ビットデータをＤ１レジスタに格納している場合には、１６×４SIMD１減算演算は以下の２つの命令を実行することによっても実現される。
MOV 0xFFFFFFFFFFFFFFFF,CR
SIMD16 D1
ここで“MOV 0xFFFFFFFFFFFFFFFF,CR”は、ＣＲ９に“0xFFFFFFFFFFFFFFFF”を格納する命令である。
【０２０９】
＜動作例１２＞
３２ビットデータを２個並列に１減算する３２×２SIMD１減算演算の場合の動作例を説明する。
１減算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１減算演算は以下の２つの命令を実行することにより実現される。
【０２１０】
DEC D1
SIMD32 D1
ここで、１減算されるべき３２ビットデータのそれぞれを“0x12345678”、“0x9ABCDEF0”とすると、Ｄ１レジスタには“0x123456789ABCDEF0”が予め格納されていることになる。
【０２１１】
図１２（ｃ）は３２×２SIMD１減算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＤＥＣ命令、
１減算命令“DEC D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＤＥＣ命令、
ＩＲ２に格納された１減算命令“DEC D1”がＤＥＣ３により解読される。解読された結果として６４ビットデータの１減算操作を実行すべきであることが判明する。この解読に基づいてＤ１レジスタの内容“0x123456789ABCDEF0”が読み出されＢＲ７に格納され、また“0x0000000000000001”がＡＲ６に格納される。
・ＩＦステージ：ＳＩＭＤ命令、
SIMD補正命令“SIMD32 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３
・ＥＸステージ：ＤＥＣ命令、
動作タイミング２においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とを加算する６４ビット桁上げ伝播減算が行われ、演算結果“0x123456789ABCDEEF”がレジスタファイル４のＤ１レジスタに格納され、また、８ビット毎の桁上げが、C7=1, C15=1, C23=1, C31=1, C39=1, C47=1, C55=1であることから図１２（ｃ）に示すような桁上げ情報“0xFFFFFFFFFFFFFF00”がＣＲ９に格納される。
【０２１２】
ここでは、Ａ−Ｂの減算をＡ＋（Ｂのビット反転）＋１で実現するので、Ｂ入力“0x0000000000000001”をビット反転し＋１した“0xFFFFFFFFFFFFFFFF”（２の補数）をＡ入力に加算する。
0003779602.tif 000071
・ＤＥＣステージ：ＳＩＭＤ命令、
ＩＲ２に格納されたSIMD補正命令“SIMD32 D1”がＤＥＣ３により解読される。解読された結果として３２ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x123456789ABCDEEF”が読み出されてＡＲ６に格納され、またＥＸステージで書込まれるＣＲ９の内容“0xFFFFFFFFFFFFFF00”が読み出され、ＥＸＴ５による３２ビット符号拡張が行われて“0xFFFFFFFF00000000”となりＢＲ７に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４
・ＥＸステージ：ＳＩＭＤ命令、
動作タイミング３においてＤＥＣ３により解読された結果に基づき、ＡＬＵ２１において、ＢＲ７の内容をＡ入力としＡＲ６の内容をＢ入力として、Ａ入力とＢ入力とに対して３２ビット単位にのみ桁上げが伝播する加算演算を行い、演算結果“0x123456779ABCDEEF”をＤ１レジスタに格納する。
【０２１３】
0003779602.tif 000072
この演算結果は、Ｄ０レジスタに予め格納されていた内容を３２ビットデータ２個とし、それぞれの３２ビットデータを１減算するSIMD演算結果となる。
【０２１４】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000073
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０２１５】
なお、１加算されるべき３２ビットデータのそれぞれを２個連結した６４ビットデータをＤ１レジスタに格納している場合には、３２×２SIMD１減算演算は以下の２つの命令を実行することによっても実現される。
MOV 0xFFFFFFFFFFFFFFFF,CR
SIMD32 D1
ここで“MOV 0xFFFFFFFFFFFFFFFF,CR”は、ＣＲ９に“0xFFFFFFFFFFFFFFFF”を格納する命令である。
【０２１６】
以上のように、本発明の実施の形態２のプロセッサは、演算の種別数によらないSIMD8、SIMD16及びSIMD32というデータ幅の種別数によるSIMD補正命令を従来の命令に追加して実装するだけで複数の演算の種別に対するSIMD演算を実行することができるので、命令数の増加を飛躍的に抑えることができる。
（実施の形態３）
＜概要＞
上記の実施の形態１及び２では、加算及び減算の場合について説明したが、本発明の実施の形態３は、乗算及び除算等の他の演算の場合について説明する。
【０２１７】
＜構成＞
図１３は、本実施の形態３に係るSIMD演算装置の構成を示す図である。
図１３に示すSIMD演算装置３０の構成は、実施の形態１で説明したSIMD演算装置１０が備えるＤＥＣ３がＤＥＣ３１に、ＡＲ６がＡＲ３２に、ＢＲ７がＢＲ３３に、ＡＬＵ８がＡＬＵ３４に、ＣＲ９がＣＲ３５、ＣＲ３６に置き換わり、ＥＸＴ５が無くなったものである。なお、SIMD演算装置１０と同様の構成要素には同一符号を付し、それらの説明を省略する。
【０２１８】
ＤＥＣ３１は命令解読器であり、ＩＲ２に保持された機械語命令を解読してSIMD演算装置内の各部を制御する。
ここではＤＥＣ３１は、２数乗算命令“MUL D0,D1”、２数除算命令“DIV D0,D1”８ビットSIMD補正命令“SIMD8 D1”、１６ビットSIMD補正命令“SIMD16 D1”、及び、他の演算命令を解読する。
【０２１９】
ＡＲ３２は６４ビット幅のレジスタであり、レジスタファイル４からの出力を保持する。
ここではＡＲ３２は、２数乗算命令“MUL D0,D1”、２数除算命令“DIV D0,D1”、８ビットSIMD補正命令“SIMD8 D1”、１６ビットSIMD補正命令“SIMD16 D1”、及び、他の演算命令の場合にＤ１レジスタからの出力を保持する。
【０２２０】
ＢＲ３３は６４ビット幅のレジスタであり、レジスタファイル４からの出力、ＣＲ３５、及び、ＣＲ３６の出力のうち一つを機械語命令に応じて選択して保持する。
ここではＢＲ３３は、２数乗算命令“MUL D0,D1”、２数除算命令“DIV D0,D1”及び他の演算命令を実行する場合にはＤ０レジスタからの出力を、８ビットSIMD補正命令“SIMD8 D1”を実行する場合にはＣＲ３５の出力を、１６ビットSIMD補正命令“SIMD16 D1”を実行する場合にはＣＲ３６の出力を選択して保持する。
【０２２１】
ＡＬＵ３４は６４ビット幅の加減算器、乗算器、除算器、及び他の演算器であり、ＡＲ３２の内容をＡ入力、ＢＲ３３の内容をＢ入力として、演算命令実行時にはＡ×Ｂの乗算、Ａ÷Ｂの除算又は他の演算を行い演算結果をレジスタに保持させると共に、当該演算結果を各SIMD演算の演算結果に補正するための各補正データを生成してＣＲ３５及びＣＲ３６に保持し、また、SIMD補正命令実行時にはＡ−Ｂの減算を行い当該演算結果を各SIMD演算結果に補正する。
【０２２２】
ここではＡＬＵ３４は、２数乗算命令“MUL D0,D1”を実行する場合にはＡ×Ｂの乗算を行い、２数除算命令“DIV D0,D1”を実行する場合にはＡ÷Ｂの除算を行い、他の演算命令を実行する場合にはそれぞれの演算を行い演算結果をレジスタに保持させると共に、ここで得られた演算結果と８ビットSIMD演算の演算結果との差分である８ビット補正データを生成してＣＲ３５に保持させ、ここで得られた演算結果と１６ビットSIMD演算の演算結果との差分である１６ビット補正データを生成してＣＲ３６に保持させる。さらにＡＬＵ３４は、８ビットSIMD補正命令“SIMD8 D1”、及び、１６ビットSIMD補正命令“SIMD16 D1”を実行する場合には、Ａ−Ｂの減算を行い、Ｄ１レジスタに保持していた演算結果を各SIMD演算結果に補正してＤ１レジスタに保持させる。
【０２２３】
ＣＲ３５及びＣＲ３６は、それぞれ補正データを保持する６４ビット幅のレジスタであり、ＣＲ３５は８ビットSIMD補正用の補正データを保持し、ＣＲ３６は１６ビットSIMD補正用の補正データを保持する。
ここで、機械語命令をＲＯＭ１からフェッチし命令レジスタ２へ書込む処理はＩＦステージで行われ、ＤＥＣ３１における機械語命令の解読と、レジスタファイル４、ＣＲ３５又はＣＲ３６からの出力とはＤＥＣステージで行われ、ＡＬＵ３４における演算とＣＲ３５及びＣＲ３６への補正データの保持はＥＸステージで行われる。
【０２２４】
＜動作＞
＜動作例１＞
８ビットデータ同士を４個並列に２数乗算する８×４SIMD２数乗算演算の場合の動作例を説明する。
乗算すべき一方の８ビットデータのそれぞれを４個連結した３２ビットデータをＤ０レジスタの下位に格納し、同様に、乗算すべきもう一方の８ビットデータのそれぞれを４個連結した３２ビットデータをＤ１レジスタの下位に格納している場合には、８×４SIMD２数乗算演算は以下の２つの命令を実行することにより実現される。
【０２２５】
MUL D0,D1
SIMD8 D1
ここで、乗算すべき一方の８ビットデータのそれぞれを“0x12”、“0x34”、“0x56”、“0x78”とし、乗算すべきもう一方の８ビットデータを全て“0x88”とすると、Ｄ０レジスタには“0x0000000012345678”、Ｄ１レジスタには“0x0000000088888888”が予め格納されていることになる。
【０２２６】
図１４は８×４SIMD２数乗算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＭＵＬ命令、
２数乗算命令“MUL D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＭＵＬ命令、
ＩＲ２に格納された２数乗算命令“MUL D0,D1”がＤＥＣ３１により解読される。解読された結果として３２ビットデータの２数乗算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x0000000012345678”が読み出されＢＲ３３に格納され、またＤ１レジスタの内容“0x0000000088888888”が読み出されＡＲ３２に格納される。
・ＩＦステージ：ＳＩＭＤ８命令、
SIMD補正命令“SIMD8 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３（構成次第では数クロック必要となるので、このような場合は動作タイミング３〜３＋αとする。）
・ＥＸステージ：ＭＵＬ命令、
動作タイミング２においてＤＥＣ３１により解読された結果に基づき、ＡＬＵ３４において、ＢＲ３３の内容をＡ入力としＡＲ３２の内容をＢ入力として、Ａ入力とＢ入力とを乗算する符号なし６４ビット乗算が行われ、演算結果“0x09B58373297DAFC0”がレジスタファイル４のＤ１レジスタに格納される。
【０２２７】
0003779602.tif 000074
また、８ビット補正データ及び１６ビット補正データを生成し、それぞれＣＲ３５、及び、ＣＲ３６に格納する。
【０２２８】
以下に、１６ビット補正データの算出方法の一例を示す。
ＢＲ３３の内容“0x0000000012345678”の下位１６ビットにマスクをかけて、“0x0000000012345678”and“0xFFFFFFFFFFFF0000”=“0x0000000012340000”・・・≪１≫。
ＡＲ３２の内容“0x0000000088888888”の下位１６ビット以外にマスクをかけて、“0x0000000088888888”and“0x000000000000FFFF”=“0x0000000000008888”・・・≪２≫。
【０２２９】
≪１≫と≪２≫とを乗算して、
0003779602.tif 000075
【０２３０】
ＢＲ３３の内容“0x0000000012345678”の下位１６ビット以外にマスクをかけて、“0x0000000012345678”and“0x000000000000FFFF”=“0x0000000000005678”・・・≪４≫。
ＡＲ３２の内容“0x0000000088888888”の下位１６ビットにマスクをかけて、“0x0000000088888888”and“0xFFFFFFFFFFFF0000”=“0x0000000088880000”・・・≪５≫。
【０２３１】
≪４≫と≪５≫とを乗算して、
0003779602.tif 000076
【０２３２】
≪３≫と≪６≫とを加算して、
0003779602.tif 000077
【０２３３】
この≪７≫が１６ビット補正データであり、これをＣＲ３６に格納する。
従って、ＡＬＵ３４は以上のような計算を実行する演算器を含んでいる。
以下に、８ビット補正データの算出方法の一例を示す。
ＢＲ３３の内容“0x0000000012345678”の下位８ビットにマスクをかけて、“0x0000000012345678”and“0xFFFFFFFFFFFFFF00”=“0x0000000012345600”・・・≪８≫。
【０２３４】
ＡＲ３２の内容“0x0000000088888888”の下位８ビット以外にマスクをかけて、“0x0000000088888888”and“0x00000000000000FF”=“0x0000000000000088”・・・≪９≫。
≪８≫と≪９≫とを乗算して、
0003779602.tif 000078
【０２３５】
ＢＲ３３の内容“0x0000000012345678”下位８ビット目から１５ビット目までにマスクをかけて、“0x0000000012345678”and“0xFFFFFFFFFFFF00FF”=“0x0000000012340078”・・・≪１１≫。
ＡＲ３２の内容“0x0000000088888888”の下位８ビット目から１５ビット目まで以外にマスクをかけて、“0x0000000088888888”and“0x000000000000FF00”=“0x0000000000008800”・・・≪１２≫。
６）≪１１≫と≪１２≫とを乗算して、
0003779602.tif 000079
【０２３６】
ＢＲ３３の内容“0x0000000012345678”の下位１６ビット目から２３ビット目までにマスクをかけて、“0x0000000012345678”and“0xFFFFFFFFFF00FFFF”=“0x0000000012005678”・・・≪１４≫。
ＡＲ３２の内容“0x0000000088888888”の下位１６ビット目から２３ビット目まで以外にマスクをかけて、“0x0000000088888888”and“0x0000000000FF0000”=“0x0000000000880000”・・・≪１５≫。
【０２３７】
≪１４≫と≪１５≫とを乗算して、
0003779602.tif 000080
【０２３８】
ＢＲ３３の内容“0x0000000012345678”の下位２４ビット目から３１ビット目までにマスクをかけて、“0x0000000012345678”and“0xFFFFFFFF00FFFFFF”=“0x0000000000345678”・・・≪１７≫。
ＡＲ３２の内容“0x0000000088888888”の下位２４ビット目から３１ビット目まで以外にマスクをかけて、“0x0000000088888888”and“0x00000000FF000000”=“0x0000000088000000”・・・≪１８≫。
【０２３９】
≪１７≫と≪１８≫とを乗算して、
0003779602.tif 000081
【０２４０】
≪１０≫、≪１３≫、≪１６≫及び≪１９≫を加算して、
0003779602.tif 000082
【０２４１】
この≪２０≫が８ビット補正データであり、これをＣＲ３５に格納する。
従って、ＡＬＵ３４は以上のような計算を実行する演算器を含んでいる。
・ＤＥＣステージ：ＳＩＭＤ８命令、
ＩＲ２に格納されたSIMD補正命令“SIMD8 D1”がＤＥＣ３１により解読される。解読された結果として８ビットデータの４並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x09B58373297DAFC0”が読み出されてＡＲ３２に格納され、またＥＸステージで書込まれるＣＲ３５の内容である８ビット補正データ“0x002567D2FBCD7000”が読み出されＢＲ３３に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４（動作タイミング３〜３＋αの場合は動作タイミング４＋α）
・ＥＸステージ：ＳＩＭＤ８命令、
動作タイミング３（又は動作タイミング３＋α）においてＤＥＣ３１により解読された結果に基づき、ＡＬＵ３４において、ＢＲ３３の内容をＡ入力としＡＲ３２の内容をＢ入力として、Ａ入力とＢ入力とに対して減算演算を行い、演算結果“0x09901BA02DB03FC0”をＤ１レジスタに格納する。
【０２４２】
0003779602.tif 000083
この演算結果“0x098F8A91C9F3FFC0”を１６ビット毎に４個に分割した“0x0990”、“0x1BA0”、“0x2DB0”及び“0x3FC0”は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ８ビットデータ４個とし、対応する符号なし８ビットデータ同志を２数乗算するSIMD演算結果となる。
【０２４３】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000084
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０２４４】
＜動作例２＞
１６ビットデータ同士を２個並列に２数乗算する１６×２SIMD２数乗算演算の場合の動作例を説明する。
乗算すべき一方の１６ビットデータのそれぞれを２個連結した３２ビットデータをＤ０レジスタの下位に格納し、同様に、乗算すべきもう一方の１６ビットデータのそれぞれを２個連結した３２ビットデータをＤ１レジスタの下位に格納している場合には、１６×２SIMD２数乗算演算は以下の２つの命令を実行することにより実現される。
【０２４５】
MUL D0,D1
SIMD16 D1
ここで、乗算すべき一方の１６ビットデータのそれぞれを“0x1234”、“0x5678”とし、乗算すべきもう一方の１６ビットデータを全て“0x8888”とすると、Ｄ０レジスタには“0x0000000012345678”、Ｄ１レジスタには“0x0000000088888888”が予め格納されていることになる。
【０２４６】
図１５は１６×２SIMD２数乗算演算時の各レジスタの内容を示す図である。
（１）動作タイミング１
・ＥＸステージ、
関知しない。
・ＤＥＣステージ、
関知しない。
・ＩＦステージ：ＭＵＬ命令、
２数乗算命令“MUL D0,D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（２）動作タイミング２
・ＥＸステージ、
関知しない。
・ＤＥＣステージ：ＭＵＬ命令、
ＩＲ２に格納された２数乗算命令“MUL D0,D1”がＤＥＣ３１により解読される。解読された結果として３２ビットデータの２数乗算操作を実行すべきであることが判明する。この解読に基づいてＤＯレジスタの内容“0x0000000012345678”が読み出されＢＲ３３に格納され、またＤ１レジスタの内容“0x0000000088888888”が読み出されＡＲ３２に格納される。
・ＩＦステージ：ＳＩＭＤ１６命令、
SIMD補正命令“SIMD16 D1”がＲＯＭ１からフェッチされ、ＩＲ２に格納される。
（３）動作タイミング３（構成次第では数クロック必要となるので、このような場合は動作タイミング３〜３＋αとする。）
・ＥＸステージ：ＭＵＬ命令、
動作タイミング２においてＤＥＣ３１により解読された結果に基づき、ＡＬＵ３４において、ＢＲ３３の内容をＡ入力としＡＲ３２の内容をＢ入力として、Ａ入力とＢ入力とを乗算する符号なし６４ビット乗算が行われ、演算結果“0x09B58373297DAFC0”がレジスタファイル４のＤ１レジスタに格納される。
【０２４７】
また、８ビット補正データ及び１６ビット補正データを生成する。
なお、ここでの演算方法、８ビット補正データ及び１６ビット補正データの生成方法は動作例１と同じなので、詳細な説明は省略する。
・ＤＥＣステージ：ＳＩＭＤ１６命令、
ＩＲ２に格納されたSIMD補正命令“SIMD16 D1”がＤＥＣ３１により解読される。解読された結果として１６ビットデータの２並列のSIMD補正操作を実行すべきであることが判明する。この解読に基づいて、ＥＸステージで書込まれるＤ１レジスタの内容“0x09B58373297DAFC0”が読み出されてＡＲ３２に格納され、またＥＸステージで書込まれるＣＲ３６の内容である１６ビット補正データ“0x000037D2FB600000”が読み出されＢＲ３３に格納される。
・ＩＦステージ、
関知しない。
（４）動作タイミング４（動作タイミング３〜３＋αの場合は動作タイミング４＋α）
・ＥＸステージ：ＳＩＭＤ１６命令、
動作タイミング３（又は動作タイミング３＋α）においてＤＥＣ３１により解読された結果に基づき、ＡＬＵ３４において、ＢＲ３３の内容をＡ入力としＡＲ３２の内容をＢ入力として、Ａ入力とＢ入力とに対して減算演算を行い、演算結果“0x”をＤ１レジスタに格納する。
【０２４８】
0003779602.tif 000085
この演算結果“0x09B54BA02E1DAFC0”を１６ビット毎に２個に分割した“0x09B54BA0”及び“0x2E1DAFC0”は、Ｄ０レジスタとＤ１レジスタとに予め格納されていた内容をそれぞれ１６ビットデータ２個とし、対応する符号なし１６ビットデータ同志を２数乗算するSIMD演算結果となる。
【０２４９】
以下に、上記SIMD演算結果を示す。
0003779602.tif 000086
・ＤＥＣステージ、
関知しない。
・ＩＦステージ、
関知しない。
【０２５０】
以上のように、本発明の実施の形態３のプロセッサは、演算の種別数によらないSIMD8及びSIMD16というデータ幅の種別数によるSIMD補正命令を従来の命令に追加して実装するだけで複数の演算の種別に対するSIMD演算を実行することができるので、命令数の増加を飛躍的に抑えることができる。
なお、実施の形態１〜２では、ＡＬＵ８又はＡＬＵ２１による演算命令実行時に、演算結果の７つのビット位置からの桁上げの有無を用いて演算の種類別に桁上げ情報を生成してＣＲ９に保持させており、また実施の形態３では、ＡＬＵ３４による演算命令実行時に、補正データを生成してＣＲ３５及びＣＲ３６させているが、必ずしも演算命令実行時に桁上げ情報や補正データを生成しなくてもよい。例えば、実施の形態１〜２においてはＡＬＵ８又はＡＬＵ２１による演算命令実行時には７つのビット位置（C7、C15、C23、C31、C39、C47、C55）からの桁上げの結果と演算の種類（ADD、SUB、INC及びDEC等）とを記録しておき、SIMD補正命令実行時に記録しておいた内容に基づいて桁上げ情報を生成したり、また、実施の形態３においてはＡＬＵ３４による演算命令実行時には補正データの元になるデータと演算の種類とを記録しておき、SIMD補正命令実行時に記録しておいた内容に基づいて補正データを生成してもよい。
【０２５１】
図１６は、演算命令実行時には桁上げの結果と演算の種類とを記録しておき、SIMD補正命令実行時に桁上げ情報を生成するSIMD演算装置の構成を示す図である。
図１６に示すSIMD演算装置４０は、図１に示すSIMD演算装置１０のＡＬＵ８の代わりにＡＬＵ４１を、ＥＸＴ５の代わりにＥＸＴ４２を、ＣＲ９の代わりにＣＲ４３及びＯＰＲ４４を備える。
【０２５２】
ＡＬＵ４１は６４ビット幅の加減算器であり、ＡＲ６の内容とＢＲ７の内容とをそれぞれＡ入力とＢ入力として、演算命令実行時にはＡ＋Ｂの加算又はＡ−Ｂの減算を行い演算結果をレジスタに保持させると共に、桁上げの結果をＣＲ４３に、演算の種類をＯＰＲ４４に保持させ、また、SIMD補正命令実行時にはＥＸＴ４２により生成される桁上げ情報に基づいて当該演算結果を各SIMD演算結果に補正する。
【０２５３】
ＥＸＴ４２は桁上げ情報生成器兼拡張器であり、８ビットSIMD補正命令がＩＲ２により解読された結果としてＣＲ４３に格納された桁上げの結果とＯＰＲ４４に格納された演算の種類とから８ビット用の桁上げ情報を生成し、１６ビットSIMD補正命令がＩＲ２により解読された結果としてＣＲ４３に格納された桁上げの結果を１６ビット符号拡張したものとＯＰＲ４４に格納された演算の種類とから１６ビット用の桁上げ情報を生成し、３２ビットSIMD補正命令がＩＲ２により解読された結果としてＣＲ４３に格納された桁上げの結果を３２ビット符号拡張したものとＯＰＲ４４に格納された演算の種類とから３２ビット用の桁上げ情報を生成し、ＢＲ７に格納する。
【０２５４】
ＣＲ４３は、演算命令実行時に桁上げの結果を保持する少なくとも７ビットのレジスタである。
ＯＰＲ４４は、演算命令実行時に演算の種類を保持するレジスタである。
また、ＣＲ９、ＣＲ３５、ＣＲ３６、ＣＲ４３及びＯＰＲ４４の内容を割込み受付時や他のコンテキスト切り換え時等にメモリ等に退避し、割込みからの復帰時や元のコンテキスト切り換え時等にこれらを復元する機能を追加することにより、演算命令とSIMD補正命令との間で矛盾なく割込みを受付けることができ、またリアルタイム性を維持したままでマルチタスク処理に対応させること等が可能となる。
【０２５５】
また各実施の形態では、ADD、SUB、INC、DEC、MUL及びDIV等の演算命令にSIMD補正命令を対応させているが、SIMD補正命令によるSIMD演算とSIMD専用命令によるSIMD演算とを混在させてもよい。例えば、SIMD補正命令に対応するのはADDとSUBの２つの命令とし、１加算および１減算は専用のSIMD専用命令を実装してもよい。
【０２５６】
例えば１加算SIMD専用命令は、INCS8（８ビットデータの８並列実行）、INCS16（１６ビットデータの４並列実行）及びINCS32（３２ビットデータの２並列実行）とし、１減算SIMD専用命令は、DECS8（８ビットデータの８並列実行）、DECS16（１６ビットデータの４並列実行）及びDECS32（３２ビットデータの２並列実行）とすればよい。
【０２５７】
このような場合においても、４つの演算の全てについてSIMD専用命令を実装する場合と比べて、総命令数を３命令分少なくすることができる。
以下に、図１に示す各構成要素を用いて、INCS8命令の動作例を説明する。
（１）INCS8命令がＤＥＣ３により解読されると、命令でオペランド指定されるレジスタがレジスタファイル４から読み出されてＡＲ６に保持されると同時に、値0x0101010101010101がＢＲ７に保持される。
（２）続いてＡＬＵ８においてＡＲ６の内容とＢＲ７の内容とが加算される。このとき、ビット位置７からビット位置８への桁上げ伝播、ビット位置１５からビット位置１６への桁上げ伝播、ビット位置２３からビット位置２４への桁上げ伝播、ビット位置３１からビット位置３２への桁上げ伝播、ビット位置３９からビット位置４０への桁上げ伝播、ビット位置４７からビット位置４８への桁上げ伝播、及び、ビット位置５５からビット位置５６への桁上げ伝播が切断され、ＡＬＵ８からの演算結果は命令語により指定されるレジスタに格納される。
【０２５８】
INCS8以外のSIMD専用命令については、ＢＲ７に保持される値が、DECS8ではINCS8と同様、INCS16とDECS16とでは0x0001000100010001、INCS32とDECS32とでは0x0000000100000001であり、ＡＬＵ８における演算が、INCS16とINCS32とではINCS8と同様、DECS8とDECS16とDECS32とでは減算であり、桁上げ伝播の切断の箇所が、DECS8ではINCS8と同様、INCS16とDECS16とではビット位置15からビット位置16への桁上げ伝播とビット位置31からビット位置32への桁上げ伝播とビット位置47からビット位置48への桁上げ伝播とを切断、INCS32とDECS32とではビット位置31からビット位置32への桁上げ伝播を切断であり、その他の動作はINCS8と同様である。
【０２５９】
このように１加算および１減算のSIMD専用命令を実装することにより、複数のアドレスを同時に一括して増減したり複数の画像データの輝度や色調を同時に一括して制御するという用途が高速に実現できる。
また各実施の形態のSIMD演算装置は、64ビットの加減算器等の演算器を用いて８ビットデータの８並列演算と、１６ビットデータの４並列演算と、３２ビットデータの２並列演算との３種類のSIMD演算を実装しているが、もっと多くの種類のSIMD演算を実装してもよいし、一部のSIMD演算だけを実装してもよい。例えば、演算器を３２ビットとして８ビットデータの４並列演算及び１６ビットデータの２並列演算を実装してもよいし、演算器を１２８ビットとして８ビットデータの１６並列演算、１６ビットデータの８並列演算、３２ビットデータの４並列演算及び６４ビットデータの２並列演算の全部、又は、一部を実装してもよい。
【０２６０】
また上記のいずれの場合であっても、実装するSIMD演算の最小のデータ幅ごとに対応する桁上げ情報を演算実行時に記録することとする。例えば、SIMD演算の最小データ幅が１６ビットの場合には、桁上げC15, C31, C47,,,C(16n-1)に基づいて桁上げ情報を生成する。
また各実施の形態では、桁上げ情報の下位８ビットは常に０であり補正に用いられないので、下位８ビットは保持しなくてもよい。
【０２６１】
また各実施の形態のSIMD演算装置では１マシンサイクルに１命令を処理するシングルスカラアーキテクチャ方式を採っているが、１マシンサイクルに複数の命令を処理するスーパースカラアーキテクチャ方式やVLIW（Very Long Instruction Word、長語命令）アーキテクチャ方式を採るものであってもよい。
また、各実施の形態のプロセッサは、命令フェッチ、解読、実行の３段パイプラインで構成されるとしているが、パイプラインの段数は何段であってもよいし、パイプライン構成を採らなくてもよい。
（実施の形態４）
＜概要＞
本発明の実施の形態４は、SIMD演算命令を、非並列演算用の演算命令と、非並列演算用の演算命令の演算結果からSIMD演算命令の演算結果へ補正する補正命令とで実現する実施の形態１〜３のプロセッサ用の機械語命令プログラムを生成するコンパイラ装置である。
【０２６２】
＜構成＞
図１７は、本実施の形態４に係るコンパイラ装置の構成を示す図である。
図１７が示すコンパイラ装置１００は、ファイル読込み部１０１、読込み用バッファ１０２、構文解析部１０３、中間コード用バッファ１０４、機械語命令生成部１０５、出力用バッファ１０６、及び、ファイル出力部１０７を備える。
【０２６３】
ファイル読込み部１０１は、ハードディスク等の外部記録媒体に記録されたＣ言語プログラムのファイルを読込み用バッファ１０２に読込む。
図１８は、読込み用バッファ１０２に読込まれるＣ言語プログラムの一例を示す図である。
図１８に示すＣ言語プログラムは、データの配列の型がｃｈａｒ型である配列変数ａ［ｉ］、配列変数ｂ［ｉ］、及び、配列変数ｃ［ｉ］において、配列変数ａ［ｉ］と配列変数ｂ［ｉ］との和を求め、その結果を配列変数ｃ［ｉ］に格納するループであり、ここではｉの値が０から６３までなので６４個の配列が操作されている。
【０２６４】
構文解析部１０３は、読込み用バッファ１０２に読込みまれたＣ言語プログラムの構文を解析して中間コードプログラムを生成し、中間コード用バッファ１０４に書き込む。ここで中間コードプログラムとは、プロセッサに依存しない形式の中間コードからなるプログラムであり、ここではSIMD演算を示す中間コードを含まない。
【０２６５】
図１９は、図１８に示すＣ言語プログラムから生成される中間コードプログラムの一例を示す図である。
図１９に示す中間コードプログラム中の各中間コードについて、以下に説明する。
（中間コード１）
変数ｉに０を代入する。
【０２６６】
（中間コード２）
ｃｈａｒ型の配列変数ａのｉ番目と、ｃｈａｒ型の配列変数ｂのｉ番目とを加算し、その結果をｃｈａｒ型の配列変数ｃのｉ番目に格納する。
（中間コード３）
変数ｉの値を１増加させる。
【０２６７】
（中間コード４）
変数ｉから６４を減算した結果により各フラグの値が更新される。
（中間コード５）
各フラグの値により、前記結果が「０以下」を示す場合、つまり中間コード４において、「ｉ−６４≦０」であった場合に、中間コード２へ分岐する。
機械語命令生成部１０５は、中間コード用バッファ１０４に格納された中間コードプログラムを入力として、SIMD演算を示す機械語命令を含む機械語命令プログラムを生成し、出力用バッファ１０６に書き込む。ここで機械語命令プログラムとは、プロセッサに依存する形式の機械語命令からなるプログラムであり、ここではSIMD演算を示す機械語命令を含む。
【０２６８】
ファイル出力部１０７は、出力用バッファ１０６に格納された機械語命令プログラムをハードディスク等の外部記録媒体に出力する。
図２０は、機械語命令生成部１０５の詳細な構成を示す図である。
図２０に示す機械語命令生成部１０５は、SIMD演算抽出部１１０、SIMD中間コード生成部１１１、及び、機械語命令出力部１１２を備える。
【０２６９】
SIMD演算抽出部１１０は、中間コード用バッファ１０４から入力される中間コードプログラムを走査して、配列の操作を行うべき中間コードを検索し、変形中間コードプログラムを生成する。ここで変形中間コードプログラムとは、中間コードプログラム中のデータの配列の操作行う中間コードを、データの配列の型に応じた所定数毎にまとめたSIMD演算を示す変形中間コードに変換したプログラムである。
【０２７０】
図２１は、図１９に示す中間コードプログラムから生成される変形中間コードプログラムの一例を示す図である。
図２１に示す変形中間コードプログラム中の各変形中間コードについて、以下に説明する。
（変形中間コード１）
変数ｉに０を代入する（中間コード１と同じ）。
【０２７１】
（変形中間コード２）
ｃｈａｒ型の配列変数ａのｉ番目から（ｉ＋７）番目までの８個の配列要素と、ｃｈａｒ型の配列変数ｂのｉ番目から（ｉ＋７）番目までの８個の配列要素とを加算し、その結果をｃｈａｒ型の配列変数ｃのｉ番目から（ｉ＋７）番目までの８個の配列要素に格納する。
【０２７２】
（変形中間コード３）
変数ｉの値を８増加させる。
（変形中間コード４）
変数ｉから６４を減算した結果により各フラグの値が更新される（中間コード４と同じ）。
【０２７３】
（変形中間コード５）
各フラグの値により、前記結果が「０以下」を示す場合、つまり変形中間コード４において、「ｉ−６４≦０」であった場合に、変形中間コード２へ分岐する。
SIMD中間コード生成部１１１は、SIMD演算抽出部１１０により生成された変形中間コードプログラムを用いてSIMD中間コードプログラムを生成する。ここでSIMD中間コードプログラムとは、SIMD演算を示す中間コードを含むSIMD中間コードプログラムである。
【０２７４】
図２２は、図２１に示す変形中間コードプログラムから生成されるSIMD中間コードプログラムの一例を示す図である。
図２２に示すSIMD中間コードプログラム中の各中間コードについて、以下に説明する。
（SIMD中間コード１）
変数ｉに０を代入する（中間コード１、変形中間コード１と同じ）。
【０２７５】
（SIMD中間コード２）
変形中間コード２におけるｃｈａｒ型の配列変数ａの８個の配列要素の読み出しに相当し、ポインタＡが示すメモリ領域から６４ビット分のデータを取り出して変数ａに格納する。
（SIMD中間コード３）
変形中間コード２におけるｃｈａｒ型の配列変数ｂの８個の配列要素の読み出しに相当し、ポインタＢが示すメモリ領域から６４ビット分のデータを取り出して変数ｂに格納する。
【０２７６】
（SIMD中間コード４）
変形中間コード２におけるｃｈａｒ型の配列変数ａの８個の配列要素とｃｈａｒ型の配列変数ｂの８個の配列要素との加算に相当し、変数ａと変数ｂとを８ビットずつSIMD加算し、結果を変数ｃに格納する。
（SIMD中間コード５）
変形中間コード２におけるｃｈａｒ型の配列変数ｃの８個の配列要素の書き込みに相当し、変数ｃをポインタＣが示すメモリ領域の６４ビット分に書き込む。
【０２７７】
（SIMD中間コード６）
変形中間コード３における変数ｉの値の増加に伴う配列変数ａ用のポインタＡの増加に相当し、ポインタＡの値を８増加させる。
（SIMD中間コード７）
変形中間コード３における変数ｉの値の増加に伴う配列変数ｂ用のポインタＢの増加に相当し、ポインタＢの値を８増加させる。
【０２７８】
（SIMD中間コード８）
変形中間コード３における変数ｉの値の増加に伴う配列変数ｃ用のポインタＣの増加に相当し、ポインタＣの値を８増加させる。
（SIMD中間コード９）
変数ｉの値を８増加させる（変形中間コード３と同じ）。
【０２７９】
（SIMD中間コード１０）
変数ｉから６４を減算した結果により各フラグの値が更新される（中間コード４、変形中間コード４と同じ）。
（SIMD中間コード１１）
各フラグの値により、前記結果が「０以下」を示す場合、つまりSIMD中間コード４において、「ｉ−６４≦０」であった場合に、SIMD中間コード２へ分岐する。
機械語命令出力部１１２は、SIMD中間コード生成部１１１により生成されたSIMD中間コードプログラムを用いて、SIMD演算を示す機械語命令を含む機械語命令プログラムを生成する。
【０２８０】
図２３は、図２２に示すSIMD中間コードプログラムから生成される機械語命令プログラムの一例を示す図である。
図２３に示す機械語命令プログラム中の各機械語命令について、以下に説明する。
（機械語命令１）
SIMD中間コード１に対応し、SIMD中間コード１における変数ｉをレジスタＤ０に割り付け、レジスタＤ０の内容からレジスタＤ０の内容を減算することにより、レジスタＤ０の内容をクリアして０にする。
【０２８１】
（機械語命令２）
SIMD中間コード２に対応し、SIMD中間コード２におけるポインタＡをレジスタＤ１に割り付け、変数ａをレジスタＤ２に割り付け、レジスタＤ１の内容により示される６４ビットのメモリ領域からデータをロードしてレジスタＤ２に格納する。
【０２８２】
（機械語命令３）
SIMD中間コード３に対応し、SIMD中間コード３におけるポインタＢをレジスタＤ３に割り付け、変数ｂをレジスタＤ４に割り付け、レジスタＤ３の内容により示される６４ビットのメモリ領域からデータをロードしてレジスタＤ４に格納する。
【０２８３】
ここでSIMD中間コード４は、通常の演算命令である機械語命令４と、通常の演算命令の演算結果をSIMD演算の結果に補正するSIMD補正命令である機械語命令５とに分解される。
（機械語命令４）
SIMD中間コード４の前半部に対応し、SIMD中間コード４における変数ｃをレジスタＤ４に割り付け、レジスタＤ２の内容とレジスタＤ４の内容とを加算して、その結果をレジスタＤ４に格納すると共に、加算時の８ビット毎の桁上げ情報を暗黙に決められている暗黙レジスタに格納する。
【０２８４】
（機械語命令５）
SIMD中間コード４の後半部に対応し、機械語命令４において暗黙レジスタに格納されている桁上げ情報を用いて、レジスタＤ４の内容を８ビット毎に補正して、８ビットのSIMD加算結果を得て、これをレジスタＤ４に格納する。
（機械語命令６）
SIMD中間コード５に対応し、SIMD中間コード５におけるポインタＣをレジスタＤ５に割り付け、レジスタＤ４の内容をレジスタＤ５の内容により示される６４ビットのメモリ領域にストアする。
【０２８５】
（機械語命令７）
SIMD中間コード６に対応し、レジスタＤ１の内容を８増加させる。
（機械語命令８）
SIMD中間コード７に対応し、レジスタＤ３の内容を８増加させる。
（機械語命令９）
SIMD中間コード８に対応し、レジスタＤ５の内容を８増加させる。
【０２８６】
（機械語命令１０）
SIMD中間コード９に対応し、レジスタＤ０の内容を８増加させる。
（機械語命令１１）
SIMD中間コード１０に対応し、レジスタＤ０の内容から６４を減算した結果により各フラグの値が更新される。
【０２８７】
（機械語命令１２）
SIMD中間コード１１に対応し、各フラグの値により、前記結果が「０以下」を示す場合、つまりゼロフラグ（Ｚ）、オーバーフローフラグ（Ｖ）、及び、ネガティブフラグ（Ｎ）との関係において、「Ｚ  ｏｒ  （Ｖ  ｘｏｒ  Ｎ）＝１」を満たす場合に、１０個前の命令である機械語命令２に分岐する。
【０２８８】
なお、上記各プログラム例においては、演算対象であるデータの配列の型がｃｈａｒ型である８ビットデータの場合を例にとって説明し、当該データを８個毎にまとめ６４ビットとしたが、当該配列の型はｃｈａｒ型以外であってもよい、例えば、ｓｈｏｒｔ型である１６ビットデータの場合には当該データを４個毎にまとめ６４ビットとし、ｉｎｔ型である１６ビットデータの場合には当該データを２個毎にまとめ６４ビットとする。
【０２８９】
＜動作＞
図２４は、SIMD演算抽出部１１０が行う変形中間コードプログラムを生成する処理の動作の概要を示す図である。
当該処理は、演算対象であるデータの配列の型が、ｃｈａｒ型、ｓｈｏｒｔ型、及び、ｉｎｔ型の何れであるかに応じて、データの操作を、それぞれ８つ、４つ、及び、２つ毎にまとめるものである。ここで、対象プロセッサは１つの演算命令でデータ幅が６４ビットのデータを一度に演算することができるものとし、ｃｈａｒ型のデータは８ビット、ｓｈｏｒｔ型のデータは１６ビット、ｉｎｔ型のデータは３２ビットのデータ幅であるものとする。
【０２９０】
以下に図２４を用いて、変形中間コードプログラムを生成する処理の概要を説明する。
（１）中間コード用バッファ１０４に格納された中間コードプログラム中に未処理の中間コードが在るか否かを判定する（ステップＳ１）。未処理の中間コードが無い場合は、当該処理を終了する。
（２）未処理の中間コードが在る場合は、未処理の中間コードの１行を処理対象コードとし、処理対象コードが配列の操作を行うものであるか否かを判定する（ステップＳ２）。処理対象コードが配列の操作を行うものでない場合は、残りの中間コードを処理するために戻る。
（３）処理対象コードが配列の操作を行うものである場合は、処理対象コードがｃｈａｒ型のデータの配列の操作を行うものであるか否かを判定する（ステップＳ３）。
（４）処理対象コードがｃｈａｒ型のデータの配列の操作を行うものである場合は、他のｃｈａｒ型のデータの配列の操作を行う処理対象コードを検索し、８つ毎にまとめてｃｈａｒ型用変形中間コードに変換し、残りの中間コードを処理するために戻る（ステップＳ４）。
（５）処理対象コードがｃｈａｒ型のデータの配列の操作を行うものでない場合は、処理対象コードがｓｈｏｒｔ型のデータの配列の操作を行うものであるか否かを判定する（ステップＳ５）。
（６）処理対象コードがｓｈｏｒｔ型のデータの配列の操作を行うものである場合は、他のｓｈｏｒｔ型のデータの配列の操作を行う処理対象コードを検索し、４つ毎にまとめてｓｈｏｒｔ型用変形中間コードに変換し、残りの中間コードを処理するために戻る（ステップＳ６）。
（７）処理対象コードがｓｈｏｒｔ型のデータの配列の操作を行うものでない場合は、処理対象コードがｉｎｔ型のデータの配列の操作を行うものであるか否かを判定する（ステップＳ７）。
（８）処理対象コードがｉｎｔ型のデータの配列の操作を行うものである場合は、他のｉｎｔ型のデータの配列の操作を行う処理対象コードを検索し、２つ毎にまとめてｉｎｔ型用変形中間コードに変換し、残りの中間コードを処理するために戻る（ステップＳ８）。
（９）処理対象コードがｉｎｔ型のデータの配列の操作を行うものでない場合は、処理対象コードがｌｏｎｇ型のデータの配列の操作を行うものであるとして、何もせずに、残りの中間コードを処理するために戻る（ステップＳ９）。
【０２９１】
以上のように、本発明の実施の形態４のコンパイラ装置は、従来のSIMD演算を通常の演算命令とSIMD補正命令とに分解することができるので、実施の形態１〜３のような各プロセッサに対応する機械語命令プログラムを生成することができ、さらには、演算の種別によらずにデータ幅の種別数によるSIMD補正命令を従来の命令に追加して実装するだけで複数の演算の種別に対するSIMD演算を実行することができるので、命令数の増加を飛躍的に抑えることができる分だけ命令語長が短くなり、プログラムのコードサイズを縮小することができる。
【０２９２】
ここで実施の形態４では、Ｃ言語プログラムを機械語命令プログラムに翻訳するコンパイラ装置を開示しているが、翻訳される方のプログラムはＣ言語プログラムに限られず高級言語プログラムであれば何であってもよく、また、翻訳した結果生成される方のプログラムは機械語命令プログラムに限られず、当該高級言語プログラムよりも高級ではないプログラムであれば何であってもよい。さらには、本発明ではSIMD演算に相当する部分を通常の演算命令とSIMD補正命令とに分解するような変換をすれば足りるので、必ずしもプログラム言語全体を翻訳しなくてもよい。例えば、SIMD演算に相当する構文を含む高級言語プログラムを、当該構文の代わりに演算命令及びSIMD補正命令を含む同一又は他の高級言語プログラムに変換するプログラム変換装置であってもよいし、SIMD演算命令を含む機械語命令プログラムを、当該SIMD演算命令の代わりに演算命令及びSIMD補正命令を含む同一又は他の機械語命令プログラムに変換するプログラム変換装置であってもよい。
【０２９３】
なお、本発明の実施の形態４の各プログラムがコンピュータ読み取り可能な記録媒体に記録されて流通したり、ネットワークで直接転送されたりして、取り引きの対象となりうる。
また、コンピュータに本発明の実施の形態１〜４のような動作を実行させることができるプログラムが、コンピュータ読み取り可能な記録媒体に記録されて流通したり、ネットワークで直接転送されたりして、取り引きの対象となりうる。
【０２９４】
ここでコンピュータ読み取り可能な記録媒体とは、例えば、フレキシブルディスク、ＣＤ、ＭＯ、ＤＶＤ、メモリーカード等の着脱可能な記録媒体、ハードディスク、半導体メモリ等の固定記録媒体等であり、特に限定されるものではない。
【０２９５】
【発明の効果】
本発明に係る演算方法は、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得る処理をコンピュータに実行させる演算方法であって、前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして前記演算を施すことによってＮ×Ｍビットの仮演算結果を１個得ると共に当該仮演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果をＭビット単位で前記補正情報を用いて補正する補正ステップとを備えることを特徴とする。
【０２９６】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【０２９７】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
また、演算方法において、前記補正ステップは、前記仮演算結果のうちの最下位のＭビットを除く部分を補正することを特徴とすることもできる。
これによって、仮演算結果のうちの最下位のＭビットを除く部分を補正することができるので、キャリーフラグを用いた前の演算からの桁上がりを考慮しない場合において、演算によって影響を及ぼされることのない最下位のＭビットを補正しないで済む。
【０２９８】
また、演算方法は、さらに、Ｐを２以上且つＮ／２以下の整数とする時、Ｍ×ＰビットのオペランドＮ／Ｐ個に対して並列に前記演算を施してＭ×Ｐビットの演算結果をＮ／Ｐ個得ることができ、前記演算ステップは前記ＭビットのオペランドＮ個を、又は、前記Ｎ×ＰビットのオペランドＮ／Ｐ個を連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによってＮ×Ｍビットの仮演算結果を１個得ると共に前記補正情報を生成し、前記補正ステップは前記Ｍ×Ｐビットの演算結果をＮ／Ｐ個得る場合に前記仮演算結果をＭ×Ｐビット単位で前記補正情報中のＭ×Ｐビット毎の影響に対応する部分のみを用いて補正することを特徴とすることもできる。
【０２９９】
これによって、さらに、Ｎ／Ｐ個のＭ×Ｐビットオペランドをまとめて演算して、補正情報中のＭ×Ｐビット毎の対応する部分のみを用いて補正することによって、前記Ｎ／Ｐ個のＭ×Ｐビット演算結果を得ることができる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、各データ幅の種別毎の補正用の命令は演算の種類に依存しないので、命令数が演算の種類とデータ幅の種別数の積では決まらず命令数が飛躍的に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが極めて少ない。
【０３００】
従って、命令数の飛躍的な増加を抑えつつSIMD演算を実装することができる。また、演算方法において、前記Ｎは８であり前記Ｍは８であり前記Ｐは２、４又は２と４の両方であること、あるいは、前記Ｎは４であり前記Ｍは１６であり前記Ｐは２であることを特徴とすることもできる。
これによって、６４ビットマイクロプロセッサにおいて、８個の８ビットオペランド、４個の１６ビットオペランド、又は、２個の３２ビットオペランドをまとめて演算して、補正情報中の対応する８ビット、１６ビット、又は、３２ビット毎に補正することによって、８個の８ビット演算結果、４個の１６ビット演算結果、又は、２個の３２ビット演算結果を得ることができる。
【０３０１】
また、演算方法において、前記演算には複数の種類があり、前記演算ステップは、Ｌを０からＮ−１までのＮ個の整数とし最下位桁を１番目の桁とする時、Ｍビット毎に前記演算の種類と前記演算によって各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げの有無とに基づいて各Ｍ×Ｌ＋１番目の桁が０及び１のいずれかである、又は、０及び−１のいずれかである補正情報を生成し、前記補正ステップは、前記Ｍビットの演算結果をＮ個得る場合に前記演算の種類に関わらず前記仮演算結果にＭビット単位で前記補正情報を加算又は減算することを特徴とすることもできる。
【０３０２】
これによって、演算の種類と、Ｍビット毎の各桁の桁上げの有無とに基づいて、Ｍビット毎に０及び１のいずれかである、又は、０及び−１のいずれかである補正情報を生成し、仮演算結果にＭビット単位で補正情報を加算及び減算のいずれかを施すことによってＮ個のＭビット演算結果を得ることができる。
また、演算方法において、前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、前記演算ステップは、前記演算の種類が１加算である時には桁上げが無かったＭ×Ｌ＋１番目の桁を−１桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、前記演算の種類が１減算である時には桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、前記演算の種類がニ数加算である時には加算すべき一方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを一方の１個の仮オペランドとし加算すべき他方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを他方の１個の仮オペランドとしてこれら２個の仮オペランドをニ数加算することによってＮ×Ｍビットの仮演算結果を１個得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、前記演算の種類がニ数減算である時には減算されるべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算されるべき１個の仮オペランドとし減算すべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算すべき１個の仮オペランドとしてこれら２個の仮オペランドをニ数減算することによってＮ×Ｍビットの仮演算結果を１個得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を−１桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、前記補正ステップは、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果からＭビット単位で前記補正情報を減算することを特徴とすることもできる。
【０３０３】
これによって、演算の種類が１加算である時、及び、ニ数減算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を−１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、演算の種類が１減算である時、及び、ニ数加算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、仮演算結果からＭビット単位で補正情報を減算することによって、前記Ｎ個のＭビット演算結果を得ることができる。
【０３０４】
また、演算方法において、前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、前記演算ステップは、前記演算の種類が１加算である時には桁上げが無かったＭ×Ｌ＋１番目の桁を１桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、前記演算の種類が１減算である時には桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、前記演算の種類がニ数加算である時には加算すべき一方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを一方の１個の仮オペランドとし加算すべき他方のＭビットのオペランドＮ個を連結したＮ×Ｍビットを他方の１個の仮オペランドとしてこれら２個の仮オペランドをニ数加算することによってＮ×Ｍビットの仮演算結果を１個得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、前記演算の種類がニ数減算である時には減算されるべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算されるべき１個の仮オペランドとし減算すべきＭビットのオペランドＮ個を連結したＮ×Ｍビットを減算すべき１個の仮オペランドとしてこれら２個の仮オペランドをニ数減算することによってＮ×Ｍビットの仮演算結果を１個得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を１桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、前記補正ステップは、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果にＭビット単位で前記補正情報を加算することを特徴とすることもできる。
【０３０５】
これによって、演算の種類が１加算である時、及び、ニ数減算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、演算の種類が１減算である時、及び、ニ数加算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、仮演算結果からＭビット単位で補正情報を加算することによって、前記Ｎ個のＭビット演算結果を得ることができる。
【０３０６】
また、演算方法において、前記演算には複数の種類があり、前記演算ステップは、さらに、前記演算の種類を保持し、前記補正ステップは、前記仮演算結果を前記演算ステップにおいて保持された演算の種類に応じて補正することを特徴とすることもできる。
これによって、演算の際に演算の種類を保持し、仮演算結果を、保持した演算の種類に応じて補正することができるので、演算の種類を考慮せずに補正情報を生成することができる。
【０３０７】
また、演算方法において、前記演算ステップは、前記演算によって各下位桁から各上位桁へ及ぼされた桁上げの有無を補正情報として生成することを特徴とすることもできる。
これによって、演算の種類を保持すると共に、各下位桁から各上位桁へ及ぼされた桁上げの有無を補正情報として保持することができるので、後で、保持した補正情報を保持した演算の種類に応じて変換することにより、仮演算結果を正しく補正することができる。
【０３０８】
また、演算方法において、前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、前記補正ステップは、前記Ｍビットの演算結果をＮ個得る場合であってＬを０からＮ−１までのＮ個の整数とし最下位桁を１番目の桁とする時、前記演算ステップにおいて保持された演算の種類が、１加算、及び、ニ数減算のいずれかである場合には前記演算ステップにより生成された補正情報に基づいて前記仮演算結果の桁上げが無かったＭ×Ｌ＋１番目の桁に１を加算し、前記演算ステップにおいて保持された演算の種類が１減算、及び、ニ数加算のいずれかである場合には前記演算ステップにより生成された補正情報に基づいて前記仮演算結果の桁上げが有ったＭ×Ｌ＋１番目の桁から１を減算することを特徴とすることもできる。
【０３０９】
これによって、保持された演算の種類が１加算である時、及び、ニ数減算である場合には桁上げが無かったＭ×Ｌ＋１番目の桁に１を加算し、保持された演算の種類が１減算である場合には桁上げが有ったＭ×Ｌ＋１番目の桁から１を減算することにより、保持された演算の種類に応じて仮演算結果を正しく補正することができる。
【０３１０】
本発明に係る演算方法は、Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施してＮ個の演算結果を得る処理をコンピュータに実行させる演算方法であって、前記Ｎ個のオペランドを連結して１個の仮オペランドとして前記演算を施すことによって前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に当該仮演算結果と前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、前記Ｎ個の演算結果を得る場合に前記仮演算結果を前記補正情報を用いて補正しＮ個に分割する補正ステップとを備えることを特徴とする。
【０３１１】
これによって、Ｎ個のオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個の演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【０３１２】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
また、演算方法において、Ｍを１以上の整数とする時、前記オペランドのビット長はＭビットであり前記演算結果のビット長はＭ×２ビットであり、前記演算ステップは、前記Ｎ個のオペランドを連結したＮ×Ｍビットを１個の仮オペランドとして前記演算を施すことによってＮ×Ｍ×２ビットの仮演算結果を１個得ると共に当該仮演算結果のＭ×２ビット毎の前記演算によって及ぼされる他のＭ×２ビットからの影響に基づいて補正情報を生成することを特徴とすることもできる。
【０３１３】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭ×２ビット演算結果を得ることができる。
また、演算方法は、さらに、Ｐを２以上、且つ、Ｎ／２以下の整数とする時、Ｍ×ＰビットのオペランドＮ／Ｐ個に対して並列に前記演算を施してＭ×Ｐ×２ビットの演算結果をＮ／Ｐ個得ることができ、前記演算ステップは、前記ＭビットのオペランドＮ個、又は、前記Ｎ×ＰビットのオペランドＮ／Ｐ個を連結したＮ×Ｍビットを１個の仮オペランドとして、前記演算を施すことによってＮ×Ｍ×２ビットの仮演算結果を１個得ると共に、Ｌを１からＮ−１までのＮ−１個の整数とし最下位桁を１番目の桁とする時、Ｍ×２ビット毎に前記演算によって各Ｍ×２×Ｌ番目の桁以下と各Ｍ×２×Ｌ＋１桁番目の以上との間で及ぼしあうＮ−１個の影響に基づいて第１補正情報を生成しＭ×２×Ｐビット毎に前記演算によって各Ｍ×２×Ｐ×Ｌ番目の桁以下とＭ×２×Ｌ＋１番目の桁以上との間で及ぼしあうＮ／Ｐ−１個の影響に基づいて第２補正情報を生成し、前記補正ステップは、前記Ｍ×２ビットの演算結果をＮ個得る場合に前記仮演算結果を前記第１補正情報を用いて補正し、前記Ｍ×Ｐ×２ビットの演算結果をＮ／Ｐ個得る場合に前記仮演算結果を前記第２補正情報を用いて補正することを特徴とすることもできる。
【０３１４】
これによって、Ｎ個のＭビットオペランド、又は、Ｎ／Ｐ個のＭ×Ｐビットオペランドをまとめて演算して、第１補正情報及び第２補正情報を生成し、第１補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、又は、第２補正情報を用いて補正することによってＮ／Ｐ個のＭ×Ｐビット演算結果を得ることができる。
【０３１５】
また、演算方法において、前記Ｎは８であり、前記Ｍは４であり、前記Ｐは２であり、前記演算は乗算であることを特徴とすることもできる。
これによって、６４ビットマイクロプロセッサにおいて、４個の８ビットオペランド、又は、２個の１６ビットオペランドをまとめて演算して、第１補正情報を用いて補正することによって４個の１６（＝８×２）ビット演算結果を得ることができ、また、第２補正情報を用いて補正することによって２個の３２（＝１６×２）ビット演算結果を得ることができる。
【０３１６】
本発明に係る演算装置は、所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行する演算装置であって、前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことを指示する演算命令と、前記演算命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正命令とを実装することを特徴とする。
【０３１７】
これによって、当該演算装置は、１個の長オペランド、又は、複数の短オペランドを１個の長オペランドと見なして演算する演算命令と、演算結果をSIMD演算の演算結果に補正するSIMD補正命令とを実装することができる。
また、演算命令は既存演算とSIMD演算とで共有でき、SIMD補正命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【０３１８】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
また、演算装置において、Ｎを２以上の整数としＭを１以上の整数とする時、Ｎ×Ｍビットの第１ビット長オペランド１個に前記演算を施してＮ×Ｍビットの第１ビット長演算結果を１個得る既存演算とＭビットの第２ビット長オペランドＮ個に対して並列に前記演算を施してＭビットの第２ビット長演算結果をＮ個得るＮ並列SIMD演算とを実行するものであり、前記第１ビット長演算結果、及び、前記補正に用いられる補正情報を保持する保持手段と、前記演算命令、及び、Ｎ並列SIMD補正命令を解読する解読手段と、前記演算命令が解読された場合に前記１個の第１ビット長オペランドに、又は、前記Ｎ個の前記第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことによってＮ×Ｍビットの第１ビット長演算結果を１個得てこれを前記保持手段に保持すると共に当該第１ビット長演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて前記補正情報を生成してこれを前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果をＭビット単位で前記保持手段に保持された補正情報を用いて補正することによって前記第２ビット長演算結果をＮ個得る実行手段とを備えることを特徴とすることもできる。
【０３１９】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、演算装置において、前記実行手段は、前記Ｎ並列SIMD補正命令が解読された場合に前記第１ビット長演算結果のうちの最下位のＭビットを除く部分を補正することを特徴とすることもできる。
【０３２０】
これによって、第１ビット長演算結果のうちの最下位のＭビットを除く部分を補正することができるので、キャリーフラグを用いた前の演算からの桁上がりを考慮しない場合において演算によって影響を及ぼされることのない最下位のＭビットを補正しないで済む。
また、演算装置は、さらに、Ｐを２以上且つＮ／２以下の整数とする時、Ｍ×Ｐビットの第３ビット長オペランドＮ／Ｐ個に対して並列に前記演算を施してＭ×Ｐビットの第３ビット長演算結果をＮ／Ｐ個得るＮ／Ｐ並列SIMD演算を実行することができ、前記解読手段は、さらに、Ｎ／Ｐ並列SIMD補正命令を解読し、前記実行手段は、前記演算命令が解読された場合に前記１個の第１ビット長オペランドに前記Ｎ個の前記第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、又は、前記Ｎ／Ｐ個の第３ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことによって第１ビット長演算結果を得てこれを前記保持手段に保持すると共に当該第１ビット長演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて前記補正情報を生成してこれを前記保持手段に保持し、前記Ｎ／Ｐ並列SIMD演算が解読された場合に前記保持手段に保持された第１ビット長演算結果をＭ×Ｐビット単位で前記保持手段に保持された補正情報中のＭ×Ｐビット毎の影響に対応する部分のみを用いて補正することを特徴とすることもできる。
【０３２１】
これによって、さらに、Ｎ／Ｐ個のＭ×Ｐビットオペランドをまとめて演算して、補正情報中のＭ×Ｐビット毎の対応する部分のみを用いて補正することによって、前記Ｎ／Ｐ個のＭ×Ｐビット演算結果を得ることができる。
また、演算用の命令は既存演算とSIMD演算とで共有でき、各データ幅の種別毎の補正用の命令は演算の種類に依存しないので、命令数が演算の種類とデータ幅の種別数の積では決まらず命令数が飛躍的に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが極めて少ない。
【０３２２】
従って、命令数の飛躍的な増加を抑えつつSIMD演算を実装することができる。また、演算装置において、前記Ｎは８であり前記Ｍは８であり前記Ｐは２、４又は２と４の両方であること、あるいは、前記Ｎは４であり前記Ｍは１６であり前記Ｐは２であることを特徴とすることもできる。
これによって、６４ビットマイクロプロセッサにおいて、８個の８ビットオペランド、４個の１６ビットオペランド、又は、２個の３２ビットオペランドをまとめて演算して、補正情報中の対応する８ビット、１６ビット、又は、３２ビット毎に補正することによって、８個の８ビット演算結果、４個の１６ビット演算結果、又は、２個の３２ビット演算結果を得ることができる。
【０３２３】
また、演算装置において、前記演算には複数の種類があり、前記実行手段は、Ｌを０からＮ−１までのＮ個の整数とし最下位桁を１番目の桁とする時、前記演算命令が解読された場合にＭビット毎に前記演算の種類と前記演算によって各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げの有無とに基づいて各Ｍ×Ｌ＋１番目の桁が０及び１のいずれかである、又は、０及び−１のいずれかである補正情報を生成し、前記SIMD補正命令が解読された場合に前記演算の種類に関わらず前記保持手段に保持された第１ビット長演算結果にＭビット単位で前記保持手段に保持された補正情報を加算又は減算することによって前記第２ビット長演算結果をＮ個得ることを特徴とすることもできる。
【０３２４】
これによって、演算の種類と、Ｍビット毎の各桁の桁上げの有無とに基づいて、Ｍビット毎に０及び１のいずれかである、又は、０及び−１のいずれかである補正情報を生成し、仮演算結果にＭビット単位で補正情報を加算及び減算のいずれかを施すことによってＮ個のＭビット演算結果を得ることができる。
また、演算装置において、前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、前記実行手段は、前記演算命令が解読された場合で、且つ、前記演算の種類が１加算である時には前記第１ビット長オペランドに１加算して第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を−１桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、前記演算命令が解読された場合で、且つ、前記演算の種類が１減算である時には前記第１ビット長オペランドから１減算して第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を１として補正情報を生成し、前記演算命令が解読された場合で、且つ、前記演算の種類がニ数加算である時には加算すべき一方のＮ個の第２ビット長オペランドを連結して一方の１個の第１ビット長オペランドと見なし加算すべき他方のＮ個の第２ビット長オペランドを連結して他方の１個の第１ビット長オペランドと見なしてこれら２個の第１ビット長オペランドをニ数加算することによって第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、前記演算命令が解読された場合で、且つ、前記演算の種類がニ数減算である時には減算されるべきＮ個の第２ビット長オペランドを連結して減算されるべき１個の第１ビット長オペランドと見なし減算すべきＮ個の第２ビット長オペランドを連結して減算すべき１個の第１ビット長オペランドと見なしてこれら２個の第１ビット長オペランドをニ数減算することによって第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を−１桁上げが有ったＭ×Ｌ＋１番目の桁を０として補正情報を生成し、前記SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果からＭビット単位で前記保持手段に保持された補正情報を減算することによって前記第２ビット長演算結果をＮ個得ることを特徴とすることもできる。
【０３２５】
これによって、演算の種類が１加算である時、及び、ニ数減算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を−１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、演算の種類が１減算である時、及び、ニ数加算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を１とする補正情報を生成し、仮演算結果からＭビット単位で補正情報を減算することによって、前記Ｎ個のＭビット演算結果を得ることができる。
【０３２６】
また、演算装置において、前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、前記実行手段は、前記演算命令が解読された場合で、且つ、前記演算の種類が１加算である時には前記第１ビット長オペランドに１加算して第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、前記演算命令が解読された場合で、且つ、前記演算の種類が１減算である時には前記第１ビット長オペランドから１減算して第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を−１として補正情報を生成し、前記演算命令が解読された場合で、且つ、前記演算の種類がニ数加算である時には加算すべき一方のＮ個の第２ビット長オペランドを連結して一方の１個の第１ビット長オペランドと見なし加算すべき他方のＮ個の第２ビット長オペランドを連結して他方の１個の第１ビット長オペランドと見なしてこれら２個の第１ビット長オペランドをニ数加算することによって第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を０桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、前記演算命令が解読された場合で、且つ、前記演算の種類がニ数減算である時には減算されるべきＮ個の第２ビット長オペランドを連結して減算されるべき１個の第１ビット長オペランドと見なし減算すべきＮ個の第２ビット長オペランドを連結して減算すべき１個の第１ビット長オペランドと見なしてこれら２個の第１ビット長オペランドをニ数減算することによって第１ビット長演算結果を得ると共に桁上げが無かったＭ×Ｌ＋１番目の桁を１桁上げが有ったＭ×Ｌ＋１番目の桁を０として補正情報を生成し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果からＭビット単位で前記保持手段に保持された補正情報を減算することによって前記第２ビット長演算結果をＮ個得ることを特徴とすることもできる。
【０３２７】
これによって、演算の種類が１加算である時、及び、ニ数減算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を１、桁上げが有ったＭ×Ｌ＋１番目の桁を０とする補正情報を生成し、演算の種類が１減算である時、及び、ニ数加算である時には、桁上げが無かったＭ×Ｌ＋１番目の桁を０、桁上げが有ったＭ×Ｌ＋１番目の桁を−１とする補正情報を生成し、仮演算結果からＭビット単位で補正情報を加算することによって、前記Ｎ個のＭビット演算結果を得ることができる。
【０３２８】
また、演算装置において、前記演算には複数の種類があり、前記実行手段は、前記演算の種類を前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果を前記保持手段に保持された演算の種類に応じて補正することを特徴とすることもできる。
これによって、演算の際に演算の種類を保持し、第１ビット長演算結果を、保持した演算の種類に応じて補正することができるので、演算の種類を考慮せずに補正情報を生成することができる。
【０３２９】
また、演算装置において、前記実行手段は、前記演算命令が解読された場合に、前記演算によって各下位桁から各上位桁へ及ぼされた桁上げの有無を補正情報として生成することを特徴とすることもできる。
これによって、演算の種類を保持すると共に、各下位桁から各上位桁へ及ぼされた桁上げの有無を補正情報として保持することができるので、後で、保持した補正情報を保持した演算の種類に応じて変換することにより、仮演算結果を正しく補正することができる。
【０３３０】
また、演算装置において、前記演算の種類は１加算、１減算、ニ数加算、及び、ニ数減算のうちの少なくとも１つを含み、前記実行手段は、前記Ｎ並列SIMD補正命令が解読された場合であってＬを０からＮ−１までのＮ個の整数とし最下位桁を１番目の桁とする時、前記保持手段に保持された演算の種類が１加算、及び、ニ数減算のいずれかである場合には前記演算命令が解読された場合に生成された補正情報に基づいて前記仮演算結果の桁上げが無かったＭ×Ｌ＋１番目の桁に１を加算し、前記保持手段に保持された演算の種類が１減算、及び、ニ数加算のいずれかである場合には前記演算命令が解読された場合に生成された補正情報に基づいて前記仮演算結果の桁上げが有ったＭ×Ｌ＋１番目の桁から１を減算することを特徴とすることもできる。
【０３３１】
これによって、保持された演算の種類が１加算である時、及び、ニ数減算である場合には桁上げが無かったＭ×Ｌ＋１番目の桁に１を加算し、保持された演算の種類が１減算である場合には桁上げが有ったＭ×Ｌ＋１番目の桁から１を減算することにより、保持された演算の種類に応じて第２ビット長演算結果を正しく補正することができる。
【０３３２】
また、演算装置において、Ｎを２以上の整数とする時、１個の第１ビット長オペランドに前記演算を施して１個の第１ビット長演算結果を得る既存演算とＮ個の第２ビット長オペランドに対して並列に前記演算を施してＮ個の第２ビット長演算結果を得るＮ並列SIMD演算とを実行するものであり、前記長演算結果、及び、前記補正に用いられる補正情報を保持する保持手段と、前記演算命令、及び、前記Ｎ並列SIMD補正命令を解読する解読手段と、前記演算命令が解読された場合に前記１個の第１ビット長オペランドに、又は、前記Ｎ個の第２ビット長オペランドを連結した１個を第１ビット長オペランドと見なして、前記演算を施すことによって第１ビット長演算結果を得てこれを前記保持手段に保持すると共に当該第１ビット長演算結果と前記Ｎ個の第２ビット長演算結果を連結した１個の第１ビット長演算結果との差分に相当する前記補正情報を生成してこれを前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果を前記保持手段に保持された補正情報を用いて補正することによって前記Ｎ並列SIMD演算の第２ビット長演算結果をＮ個得る実行手段とを備えることを特徴とすることもできる。
【０３３３】
これによって、Ｎ個のオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個の演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、演算装置において、Ｍを１以上の整数とする時、前記第１ビット長オペランドのビット長はＮ×Ｍビットであり前記第２ビット長オペランドのビット長はＭビットであり前記第１ビット長演算結果のビット長はＮ×Ｍ×２ビットであり前記第２ビット長演算結果のビット長はＭ×２ビットであり、前記実行手段は、前記演算命令が解読された場合に前記１個の第１ビット長オペランドに、又は、前記Ｎ個の第２ビット長オペランドを連結した１個を第１ビット長オペランドと見なして、前記演算を施すことによって前記Ｎ×Ｍ×２ビットの第１ビット長演算結果を１個得てこれを前記保持手段に保持すると共に当該第１ビット長演算結果のＭ×２ビット毎の前記演算によって及ぼされる他のＭ×２ビットからの影響に基づいて補正情報を生成してこれを前記保持手段に保持することを特徴とすることもできる。
【０３３４】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭ×２ビット演算結果を得ることができる。
また、演算装置は、さらに、Ｐを２以上、且つ、Ｎ／２以下の整数とする時、Ｍ×Ｐビットの第３ビット長オペランドＮ／Ｐ個に対して並列に前記演算を施してＭ×Ｐ×２ビットの第３ビット長演算結果をＮ／Ｐ個得るＮ／Ｐ並列SIMD演算を実行することができ、前記解読手段は、さらに、Ｎ／Ｐ並列SIMD補正命令を解読し、前記実行手段は、前記演算命令が解読された場合に前記１個の第１ビット長オペランドに前記Ｎ個の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、又は、前記Ｎ／Ｐ個の第３ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことによってＮ×Ｍ×２ビットの第１ビット長演算結果を１個得てこれを前記保持手段に保持すると共に、Ｌを１からＮ−１までのＮ−１個の整数とし最下位桁を１番目の桁とする時、Ｍ×２ビット毎に前記演算によって各Ｍ×２×Ｌ番目の桁以下と各Ｍ×２×Ｌ＋１番目の桁以上との間で及ぼしあうＮ−１個の影響に基づいて第１補正情報を生成しＭ×２×Ｐビット毎に前記演算によって各Ｍ×２×Ｐ×Ｌ番目の桁以下とＭ×２×Ｌ＋１番目の桁以上との間で及ぼしあうＮ／Ｐ−１個の影響に基づいて第２補正情報を生成してこれらを前記保持手段に保持し、前記Ｎ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果を前記保持手段に保持された第１補正情報を用いて補正し、前記Ｎ／Ｐ並列SIMD補正命令が解読された場合に前記保持手段に保持された第１ビット長演算結果を前記保持手段に保持された第２補正情報を用いて補正することを特徴とすることもできる。
【０３３５】
これによって、Ｎ個のＭビットオペランド、又は、Ｎ／Ｐ個のＭ×Ｐビットオペランドをまとめて演算して、第１補正情報及び第２補正情報を生成し、第１補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、又は、第２補正情報を用いて補正することによってＮ／Ｐ個のＭ×Ｐビット演算結果を得ることができる。
【０３３６】
また、演算装置において、前記Ｎは８であり、前記Ｍは４であり、前記Ｐは２であり、前記演算は乗算であることを特徴とすることもできる。
これによって、６４ビットマイクロプロセッサにおいて、４個の８ビットオペランド、又は、２個の１６ビットオペランドをまとめて演算して、第１補正情報を用いて補正することによって４個の１６（＝８×２）ビット演算結果を得ることができ、また、第２補正情報を用いて補正することによって２個の３２（＝１６×２）ビット演算結果を得ることができる。
【０３３７】
また、演算装置は、さらに、割込み受付時、又は、他のコンテキストへの切り換え時に、前記保持手段に保持された内容を当該演算装置の外部の記憶装置に退避する退避手段と、前記割込みからの復帰時、又は、元のコンテキストへの切り換え時に、前記記憶装置に退避されている内容を前記保持手段に復元する復元手段とを備えることを特徴とすることもできる。
【０３３８】
これによって、割込み受付時又は他のコンテキストへの切り換え時に保持手段に保持された内容を退避し、割込みからの復帰時又は元のコンテキストへの切り換え時に復元することができるので、演算命令の実行とSIMD補正命令の実行との間で割込みやコンテキストへの切り換えを受け付けても矛盾が生じない。
従って、リアルタイム性を悪化させずマルチメディア処理を好適に行うことができ、マルチタスク処理に対応させることができる。
【０３３９】
本発明に係る演算装置は、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得るＮ並列SIMD（Single Instruction Multiple Data）演算を実行する演算装置であって、Ｎ個のＭビットのオペランドのそれぞれに１を加えるＮ並列SIMD１加算命令を実装し、前記Ｎ並列SIMD１加算命令を解読する解読手段と、前記Ｎ並列SIMD１加算命令が解読された場合にＬを１からＮ−１までのＮ−１個の整数とし最下位桁を１番目の桁とする時、Ｎ個のＭビットのオペランドを結合したデータとそれぞれがＭビットからなる１を表すデータをＮ個結合したデータとの加算を各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げ伝播を切断して行う実行手段とを備えることを特徴とする。
【０３４０】
これによって、演算装置がＮ並列SIMD１加算命令を解読し実行することができる。
従って、複数のアドレスを同時に一括して増加させたり、複数の画像データの輝度や色調を同時に変化させるような処理を高速に実現できる。
本発明に係る演算装置は、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得るＮ並列SIMD（Single Instruction Multiple Data）演算を実行する演算装置であって、Ｎ個のＭビットのオペランドのそれぞれから１を引くＮ並列SIMD１減算命令を実装し、前記Ｎ並列SIMD１減算命令を解読する解読手段と、前記Ｎ並列SIMD１減算命令が解読された場合にＬを１からＮ−１までのＮ−１個の整数とし最下位桁を１番目の桁とする時、Ｎ個のＭビットのオペランドを結合したデータからそれぞれがＭビットからなる１を表すデータをＮ個結合したデータを引く減算を各Ｍ×Ｌ番目の桁から各Ｍ×Ｌ＋１番目の桁への桁上げ伝播を切断して行う実行手段とを備えることを特徴とする。
【０３４１】
これによって、演算装置がＮ並列SIMD１減算命令を解読し実行することができる。
従って、複数のアドレスを同時に一括して減少させたり、複数の画像データの輝度や色調を同時に変化させるような処理を高速に実現できる。
本発明に係るプログラム変換装置は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換装置であって、前記プログラム中の演算命令を解析する解析手段と、前記解析手段により前記SIMD演算命令が解析された場合に当該SIMD演算命令を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換手段とを備えることを特徴とする。
【０３４２】
本発明に係るプログラム変換方法は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換方法であって、前記プログラム中の演算命令を解析する解析ステップと、前記解析ステップにより前記SIMD演算命令が解析された場合に当該SIMD演算命令を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換ステップとを含むことを特徴とする。
【０３４３】
本発明に係るプログラム変換プログラムは、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算命令及び他の演算命令からなるプログラムを変換するプログラム変換プログラムであって、コンピュータに、前記プログラム中の演算命令を解析する解析ステップと、前記解析ステップにより前記SIMD演算命令が解析された場合に当該SIMD演算命令を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算命令、及び、前記演算命令による演算結果を前記SIMD演算命令の演算結果に補正することを指示するSIMD補正命令に変換する変換ステップとを実行させることを特徴とする。
【０３４４】
これらによって、SIMD演算命令を他の演算命令とSIMD補正命令とに変換することができる。
従って、プロセッサに、演算の種別によらずにデータ幅の種別数によるSIMD補正命令を従来の演算命令に追加して実装させるだけで複数の演算の種別に対するSIMD演算を実行させることができるので、命令数の増加を飛躍的に抑えることができる分だけ命令語長が短くなり、プログラムのコードサイズを縮小することができる。
【０３４５】
本発明に係るコンパイル装置は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を演算装置に実行させるべき構文を含む高級言語プログラムを前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイル装置であって、前記高級言語プログラムの構文を解析する解析手段と、前記解析手段により解析された構文を機械語命令列に変換することにより機械語プログラムを生成するコンパイル手段とを備え、前記コンパイル手段は、前記解析手段により前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換することを特徴とする。
【０３４６】
本発明に係るコンパイル方法は、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を演算装置に実行させるべき構文を含む高級言語プログラムを前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイル方法であって、前記高級言語プログラムの構文を解析する解析ステップと、前記解析手段により解析された構文を機械語命令列に変換することにより機械語プログラムを生成するコンパイルステップとを備え、前記コンパイルステップは、前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換することを特徴とする。
【０３４７】
本発明に係るコンパイルプログラムは、所定ビット長のオペランドの複数に対して並列に演算を施すSIMD（Single Instruction Multiple Data）演算を演算装置に実行させるべき構文を含む高級言語プログラムを前記演算装置が実行可能な複数の機械語命令からなる機械語プログラムにコンパイルするコンパイルプログラムであって、コンピュータに、前記高級言語プログラムの構文を解析する解析ステップと、前記解析手段により解析された構文を機械語命令列に変換することにより機械語プログラムを生成するコンパイルステップとを備え、前記コンパイルステップは、前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記所定ビット長のオペランドの複数を連結して１個のオペランドと見なして前記演算を施すことを指示する演算機械語命令、及び、前記演算機械語命令による演算結果を前記SIMD演算の演算結果に補正することを指示するSIMD補正機械語命令を含む機械語命令列に変換することを実行させることを特徴とする。
【０３４８】
これらによって、SIMD演算の構文を、演算機械語命令とSIMD補正機械語命令とに変換することができる。
従って、プロセッサに、演算の種別によらずにデータ幅の種別数によるSIMD補正機械語命令を従来の演算機械語命令に追加して実装させるだけで複数の演算の種別に対するSIMD演算を実行させることができるので、命令数の増加を飛躍的に抑えることができる分だけ命令語長が短くなり、プログラムのコードサイズを縮小することができる。
【０３４９】
また、コンパイル装置において、前記コンパイル手段は、前記解析手段により前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記SIMD演算を示す中間言語コードを含む中間言語コード列に変換する一次変換手段と、前記SIMD演算を示す中間言語コードを前記演算機械語命令、及び、SIMD補正機械語命令に変換する二次変換手段とを含むことを特徴とすることもできる。
【０３５０】
また、コンパイル方法において、前記コンパイルステップは、前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記SIMD演算を示す中間言語コードを含む中間言語コード列に変換する一次変換サブステップと、前記SIMD演算を示す中間言語コードを前記演算機械語命令、及び、SIMD補正機械語命令に変換する二次変換サブステップとを含むことを特徴とすることもできる。
【０３５１】
また、コンパイルプログラムにおいて、前記コンパイルステップは、前記解析ステップにより前記SIMD演算を実行させるべき構文が解析された場合に当該構文を前記SIMD演算を示す中間言語コードを含む中間言語コード列に変換する一次変換サブステップと、前記SIMD演算を示す中間言語コードを前記演算機械語命令、及び、SIMD補正機械語命令に変換する二次変換サブステップとを含むことを特徴とすることもできる。
【０３５２】
これらによって、SIMD演算の構文を、一旦SIMD演算を示す中間言語コードを含む中間言語コード列に変換し、SIMD演算を示す中間言語コードを演算機械語命令とSIMD補正機械語命令とに変換することができる。
本発明に係る演算プログラムは、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得る処理をコンピュータに実行させる演算プログラムであって、コンピュータに、前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして前記演算を施すことによってＮ×Ｍビットの仮演算結果を１個得ると共に当該仮演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果をＭビット単位で前記補正情報を用いて補正する補正ステップとを実行させることを特徴とする。
【０３５３】
本発明に係る演算プログラムを記録したコンピュータ読み取り可能な記録媒体は、Ｎを２以上の整数としＭを１以上の整数とする時、ＭビットのオペランドＮ個に対して並列に演算を施してＭビットの演算結果をＮ個得る処理をコンピュータに実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、コンピュータに、前記ＭビットのオペランドＮ個を連結したＮ×Ｍビットを１個の仮オペランドとして前記演算を施すことによってＮ×Ｍビットの仮演算結果を１個得ると共に当該仮演算結果のＭビット毎の前記演算によって及ぼされる各隣接桁からの影響に基づいて補正情報を生成する演算ステップと、前記Ｍビットの演算結果をＮ個得る場合に前記仮演算結果をＭビット単位で前記補正情報を用いて補正する補正ステップとを実行させることを特徴とする演算プログラムを記録する。
【０３５４】
これによって、Ｎ個のＭビットオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個のＭビット演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【０３５５】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
また、演算プログラムにおいて、前記補正ステップは、前記仮演算結果のうちの最下位のＭビットを除く部分を補正することを特徴とすることもできる。
また、演算プログラムを記録したコンピュータ読み取り可能な記録媒体において、前記補正ステップは、前記仮演算結果のうちの最下位のＭビットを除く部分を補正することを特徴とすることもできる。
【０３５６】
これによって、仮演算結果のうちの最下位のＭビットを除く部分を補正することができるので、キャリーフラグを用いた前の演算からの桁上がりを考慮しない場合において、演算によって影響を及ぼされることのない最下位のＭビットを補正しないで済む。
本発明に係る演算プログラムは、Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施してＮ個の演算結果を得る処理をコンピュータに実行させる演算プログラムであって、コンピュータに、前記Ｎ個のオペランドを連結して１個の仮オペランドとして前記演算を施すことによって前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に当該仮演算結果と前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、前記Ｎ個の演算結果を得る場合に前記仮演算結果を前記補正情報を用いて補正しＮ個に分割する補正ステップとを実行させることを特徴とする。
【０３５７】
本発明に係る演算プログラムを記録したコンピュータ読み取り可能な記録媒体は、Ｎを２以上の整数とする時、Ｎ個のオペランドに対して並列に演算を施してＮ個の演算結果を得る処理をコンピュータに実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、コンピュータに、前記Ｎ個のオペランドを連結して１個の仮オペランドとして前記演算を施すことによって前記演算結果のＮ倍の大きさの仮演算結果を１個得ると共に当該仮演算結果と前記Ｎ個の演算結果を連結した１個の仮演算結果との差分に相当する補正情報を生成する演算ステップと、前記Ｎ個の演算結果を得る場合に前記仮演算結果を前記補正情報を用いて補正しＮ個に分割する補正ステップとを実行させることを特徴とする演算プログラムを記録する。
【０３５８】
これによって、Ｎ個のオペランドをまとめて演算して、補正情報を用いて補正することによってＮ個の演算結果を得ることができ、膨大な量のデータに同じ演算を施す場合に時間を大幅に短縮できる。
また、当該演算方法を用いるプロセッサにおいては、演算用の命令は既存演算とSIMD演算とで共有でき、補正用の命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【０３５９】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
本発明に係る演算プログラムは、コンピュータに所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行させる演算プログラムであって、前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことをコンピュータに指示する演算命令と、前記演算命令による演算結果を前記SIMD演算の演算結果に補正することをコンピュータに指示するSIMD補正命令とを含むことを特徴とする。
【０３６０】
本発明に係る演算プログラムを記録したコンピュータ読み取り可能な記録媒体は、コンピュータに所定ビット長の第１ビット長オペランド１個に演算を施す既存演算と前記所定ビット長よりも短い第２ビット長オペランドの複数に対して並列に前記演算を施すSIMD（Single Instruction Multiple Data）演算とを実行させる演算プログラムを記録したコンピュータ読み取り可能な記録媒体であって、前記１個の第１ビット長オペランドに、又は、前記複数の第２ビット長オペランドを連結して１個の第１ビット長オペランドと見なして、前記演算を施すことをコンピュータに指示する演算命令と、前記演算命令による演算結果を前記SIMD演算の演算結果に補正することをコンピュータに指示するSIMD補正命令とを含むことを特徴とする演算プログラムを記録する。
【０３６１】
これによって、当該演算装置は、１個の長オペランド、又は、複数の短オペランドを１個の長オペランドと見なして演算する演算命令と、演算結果をSIMD演算の演算結果に補正するSIMD補正命令とを実装することができる。
また、演算命令は既存演算とSIMD演算とで共有でき、SIMD補正命令は演算の種類に依存しないので、命令数が演算の種類毎に増えないため、従来のSIMD演算命令を実装する場合に較べて、機械語命令のビット割付を圧迫したり、命令デコーダ回路が大規模化してコスト及び消費電力の増加を招くことが少ない。
【０３６２】
従って、命令数の増加を抑えつつSIMD演算を実装することができる。
【図面の簡単な説明】
【図１】本実施の形態１に係るSIMD演算装置の構成を示す図である。
【図２】（ａ）〜（ｄ）は、ＣＲ９に保持される桁上げ情報のビット構成の一例を示す図である。
【図３】（ａ）〜（ｃ）はSIMDニ数加算演算時の各レジスタの内容を示す図である。
【図４】（ａ）〜（ｃ）はSIMDニ数減算演算時の各レジスタの内容を示す図である。
【図５】（ａ）〜（ｃ）はSIMD１加算演算時の各レジスタの内容を示す図である。
【図６】（ａ）〜（ｃ）はSIMD１減算演算時の各レジスタの内容を示す図である。
【図７】本実施の形態２に係るSIMD演算装置の構成を示す図である。
【図８】（ａ）〜（ｄ）は、ＣＲ９に保持される桁上げ情報のビット構成の一例を示す図である。
【図９】（ａ）〜（ｃ）はSIMDニ数加算演算時の各レジスタの内容を示す図である。
【図１０】（ａ）〜（ｃ）はSIMDニ数減算演算時の各レジスタの内容を示す図である。
【図１１】（ａ）〜（ｃ）はSIMD１加算演算時の各レジスタの内容を示す図である。
【図１２】（ａ）〜（ｃ）はSIMD１減算演算時の各レジスタの内容を示す図である。
【図１３】本実施の形態３に係るSIMD演算装置の構成を示す図である。
【図１４】８×４SIMD２数乗算演算時の各レジスタの内容を示す図である。
【図１５】１６×２SIMD２数乗算演算時の各レジスタの内容を示す図である。
【図１６】演算命令実行時には桁上げの結果と演算の種類とを記録しておき、SIMD補正命令実行時に桁上げ情報を生成するSIMD演算装置の構成を示す図である。
【図１７】本実施の形態４に係るコンパイラ装置の構成を示す図である。
【図１８】読込み用バッファ１０２に読込まれるＣ言語プログラムの一例を示す図である。
【図１９】図１８に示すＣ言語プログラムから生成される中間コードプログラムの一例を示す図である。
【図２０】機械語命令生成部１０５の詳細な構成を示す図である。
【図２１】図１９に示す中間コードプログラムから生成される変形中間コードプログラムの一例を示す図である。
【図２２】図２１に示す変形中間コードプログラムから生成されるSIMD中間コードプログラムの一例を示す図である。
【図２３】図２２に示すSIMD中間コードプログラムから生成される機械語命令プログラムの一例を示す図である。
【図２４】  SIMD演算抽出部１１０が行う変形中間コードプログラムを生成する処理の動作の概要を示す図である。
【符号の説明】
１    ＲＯＭ
２    ＩＲ
３    ＤＥＣ
４    レジスタファイル
５    ＥＸＴ
６    ＡＲ
７    ＢＲ
８    ＡＬＵ
９    ＣＲ
１０    SIMD演算装置
２０    SIMD演算装置
２１    ＡＬＵ
３０    SIMD演算装置
３１    ＤＥＣ
３２    ＡＲ
３３    ＢＲ
３４    ＡＬＵ
３５    ＣＲ
３６    ＣＲ
４０    SIMD演算装置
４１    ＡＬＵ
４２    ＥＸＴ
４３    ＣＲ
４４    ＯＰＲ
１００    コンパイラ装置
１０１    ファイル読込み部
１０２    読込み用バッファ
１０３    構文解析部
１０４    中間コード用バッファ
１０５    機械語命令生成部
１０６    出力用バッファ
１０７    ファイル出力部
１１０    SIMD演算抽出部
１１１    SIMD中間コード生成部
１１２    機械語命令出力部
【図１】
0003779602.tif 000087
【図２】
0003779602.tif 000088
【図３】
0003779602.tif 000089
【図４】
0003779602.tif 000090
【図５】
0003779602.tif 000091
【図６】
0003779602.tif 000092
【図７】
0003779602.tif 000093
【図８】
0003779602.tif 000094
【図９】
0003779602.tif 000095
【図１０】
0003779602.tif 000096
【図１１】
0003779602.tif 000097
【図１２】
0003779602.tif 000098
【図１３】
0003779602.tif 000099
【図１４】
0003779602.tif 000100
【図１５】
0003779602.tif 000101
【図１６】
0003779602.tif 000102
【図１７】
0003779602.tif 000103
【図１８】
0003779602.tif 000104
【図１９】
0003779602.tif 000105
【図２０】
0003779602.tif 000106
【図２１】
0003779602.tif 000107
【図２２】
0003779602.tif 000108
【図２３】
0003779602.tif 000109
【図２４】
0003779602.tif 000110