(57)【要約】  データ処理システム（２）は、単一命令複数データレジスタファイル（１２）と、単一命令複数処理回路（１４）と、を含む。単一命令複数データ処理回路（１４）は、ハッシュアルゴリズムの一部を行うための暗号化処理命令の実行をサポートする。オペランドは、単一命令複数データレジスタファイル（１２）内に記憶される。暗号化サポート命令は、通常のレーンベース処理に従わず、出力オペランドの異なる部分が入力オペランド内の複数の異なる要素に依存する出力オペランドを生成する。
2015501946.tif 000002
【特許請求の範囲】
【請求項１】
データ処理装置であって、
単一命令複数データレジスタファイルと、
前記単一命令複数データレジスタファイルに連結され、前記単一命令複数データレジスタファイルの入力オペランドレジスタ内の別個のレーン内に記憶された別個のデータ要素に対して独立して処理操作を行うために、単一命令複数データプログラム命令によって制御されるように構成された、単一命令複数データ処理回路と、を備え、
前記単一命令複数データ処理回路が、前記単一命令複数データレジスタファイルの入力オペランドレジスタ内に保持されたデータ要素のシーケンスを含むベクトルデータ値に対してさらなる処理操作を行って、前記単一命令複数データレジスタファイルの出力オペランドレジスタ内に記憶された出力オペランドを生成するために、さらなるプログラム命令によって制御されるように構成され、
前記出力オペランドが、前記データ要素のシーケンス内のすべてのデータ要素に依存する値を持つ第１の部分を有する、データ処理装置。
【請求項２】
前記さらなるプログラム命令が、前記ベクトルデータ値を形成するデータの複数のワードに依存して、前記出力オペランドとして出力ハッシュ値を生成するように操作する、暗号化プログラム命令である、請求項１に記載のデータ処理装置。
【請求項３】
前記さらなるプログラム命令が、データの連続ワードおよび中間ハッシュ値の少なくとも一部分を使い尽くす反復処理操作を行って、前記出力ハッシュ値を生成する、請求項２に記載のデータ処理装置。
【請求項４】
前記さらなるプログラム命令が、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を有するように、前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N―1));
{
Index=(I*32);
t1[31:0]=OP FUNC(X[63:32],X[95:64],X[127:96]);
Y[31:0]=Y[31:0]+ROL(X[31:1],5)+T1[31:0]+Vm[Index+31:Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y[31:0];
Y[31:0]=X[127:96];
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=X[127:0]、
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転である、請求項１、２、および３のいずれか１項に記載のデータ処理装置。
【請求項５】
前記さらなるプログラム命令は、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を備え、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を有するように、前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N-1));
{
Index=(I*32);
T1[31:0]=OP_FUNC(X[63:32],X[95:64],X[127:96]);
Y=Y+ROL(X[31:0],5)+T1[31:0]+Vm[(Index+31):Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y;
Y=X[127:96];
X[127:0]={X[95:0]:T2[31:0]};
}
Qdoutput[127:0]={0:Y[31:0]};
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転である、請求項１、２、および３のいずれか１項に記載のデータ処理装置。
【請求項６】
前記さらなるプログラム命令が、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）として、
（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ）
のうちの１つを選択するフィールドを含む、請求項４および５のいずれか１項に記載のデータ処理装置。
【請求項７】
前記第１の入力オペランドＱｄ［１２７：０］および前記第２の入力オペランドＳｎ［３１：０］が、前記単一命令複数データレジスタファイル内の別個のレジスタから読み取られる、請求項４、５、および６のいずれか１項に記載のデータ処理装置。
【請求項８】
前記第１の入力オペランドＱｄ［１２７：０］および前記第２の入力オペランドＳｎ［３１：０］が、前記単一命令複数データレジスタファイル内の共有レジスタから読み取られる、請求項４、５、および６のいずれか１項に記載のデータ処理装置。
【請求項９】
前記さらなるプログラム命令が、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を有するように、前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[127:0]=Qn[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=X[127:0];
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）  ＸＯＲ  ＲＯＲ（Ｂ，１３）  ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６）  ＸＯＲ  ＲＯＲ（Ｂ，１１）  ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、かつＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である、請求項１、２、および３のいずれか１項に記載のデータ処理装置。
【請求項１０】
前記さらなるプログラム命令が、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を有するように、前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qn[127:0];
Y[127:0]=Qd[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=Y[127:0];
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）  ＸＯＲ  ＲＯＲ（Ｂ，１３）  ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６）  ＸＯＲ  ＲＯＲ（Ｂ，１１）  ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、かつＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である、請求項１、２、および３のいずれか１項に記載のデータ処理装置。
【請求項１１】
前記第１の入力オペランドＱｄ［１２７：０］および前記第２の入力オペランドＱｎ［１２７：０］が、前記単一命令複数データレジスタファイル内の別個のレジスタから読み取られる、請求項９および１０のいずれか１項に記載のデータ処理装置。
【請求項１２】
前記第１の入力オペランドＱｄ［１２７：０］および前記第２の入力オペランドＱｎ［１２７：０］が、前記単一命令複数データレジスタファイル内の共有レジスタから読み取られる、請求項９および１０のいずれか１項に記載のデータ処理装置。
【請求項１３】
前記単一命令複数データ処理回路が、前記さらなるプログラム命令および前記単一命令複数データプログラム命令の処理を管理するための共通機構を利用する、請求項１〜１２のいずれか１項に記載のデータ処理装置。
【請求項１４】
前記処理の管理が、以下の管理：
レジスタリネーミング、
命令スケジューリング、
命令発行、
命令リタイア、および
命令割込み
のうちの１つ以上を含む、請求項１３に記載のデータ処理装置。
【請求項１５】
前記単一命令複数データ処理回路が、入力オペランドＳｍ［３１：０］を有し、Ｓｍ［３１：０］の２ビット位置だけの右回転により得られるものと同一の値を持つ出力オペランドＳｄ［３１：０］を生成する回転命令によって制御されるように構成される、請求項４および５のいずれか１項に記載のデータ処理装置。
【請求項１６】
前記単一命令複数データ処理回路が、第１の入力オペランドＳｐ［１２７：０］および第２の入力オペランドＳｑ［１２７：０］を有し、以下のステップ：
T[127:0]={Sp[63:0]:Sq[127:64]}
および
Sr[127:0]=T[127:0] XOR Sr[127:0] XOR Sq[127:0]
により得られるものと同一の値を持つ出力オペランドＳｒ［１２７：０］を生成する、第１のスケジュール更新命令によって制御されるように構成される、請求項４および５のいずれか１項に記載のデータ処理装置。
【請求項１７】
前記単一命令複数データ処理回路が、入力オペランドＳｓ［１２７：０］を有し、以下のステップにより得られるものと同一の値を持つ出力オペランドＳｔ［１２７：０］を生成する、第２のスケジュール更新命令によって制御されるように構成される、
T[127:0]=St[127:0] XOR {32{0}:Ss[127:32]};
St[95:0]={T[94:64]:T[95]:T[62:32]:T[63]:T[30:0]:T[31]};
および
St[127:96]=({T[126:96]:T[127]}) XOR ({T[29:0]:T[31:30]})
請求項１４に記載のデータ処理装置。
【請求項１８】
前記単一命令複数データ処理回路が、入力オペランドＳｐ［１２７：０］を有し、以下のステップにより得られるものと同一の値を持つ出力オペランドＳｑ［１２７：０］を生成する、第１のスケジュール更新命令によって制御されるように構成され、
T[127:0]={Sp[31:0]:Sq[127:32]};
T[127:0]=VecROR32(T[127:0],7) XOR VecROR32(T[127:0],18) XOR VecROR32(T[127:0],3);
および
Sq[127:0]=VecADD32(T[127:0],Sq[127:0])
式中、ＶｅｃＲＯＲ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢビット位置による別個の右回転であり、ＶｅｃＡＤＤ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢ内の対応する３２ビットワードへの別個の追加である、請求項９および１０のいずれか１項に記載のデータ処理装置。
【請求項１９】
前記単一命令複数データ処理回路が、第１の入力オペランドＳｐ［１２７：０］および第２の入力オペランドＳｑ［１２７：０］を有し、以下のステップにより得られるものと同一の値を持つ出力オペランドＳｒ［１２７：０］を生成する、第２のスケジュール更新命令によって制御されるように構成され、
T0[127:0]={Sq[31:0]:Sp[127:32]};
T1[63:0]=Sq[127:64];
T1[63:0]=VecROR32(T1[63:0],17) XOR VecROR32(T1[63:0],19) XOR VecROR32(T1[63:0],10);
T3[63:0]=VecADD32(Sr[63:0],T0[63:0]);
T1[63:0]=VecADD32(T3[63:0],T1[63:0]);
T2[63:0]=VecROR32(T1[63:0],17) XOR VecROR32(T1[63:0],19) XOR VecROR32(T1[63:0],10);
T3[63:0]=VecADD32(Sr[127:64],T0[127:64]);
および
Sr[127:0]={VecADD32(T3[63:0],T2[63:0]):T1[63:0]}
式中、ＶｅｃＲＯＲ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢビット位置による別個の右回転であり、ＶｅｃＡＤＤ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢ内の対応する３２ビットワードへの別個の追加である、請求項１８に記載のデータ処理装置。
【請求項２０】
前記単一命令複数データレジスタファイルから分離した汎用レジスタファイルであって、前記単一命令複数データレジスタファイル内のレジスタより低いビット幅を持つ汎用レジスタを有する、汎用レジスタファイルと、
前記汎用レジスタファイルに連結され、前記汎用レジスタのうちの１つ内に記憶された入力オペランドに対して処理操作を行うために、汎用処理命令により制御されるように構成された、汎用処理回路と、
をさらに備える、請求項１〜１９のいずれか１項に記載のデータ処理装置。
【請求項２１】
データ処理装置であって、
単一命令複数データオペランドを記憶するための単一命令複数データレジスタファイル手段と、
単一命令複数データプログラム命令の制御下で処理操作を行うための単一命令複数データ処理手段であって、前記単一命令複数データレジスタファイル手段に連結され、前記処理操作が、前記単一命令複数データレジスタファイル手段の入力オペランドレジスタ内の別個のレーン内に記憶された別個のデータ要素に対して独立して行われる、単一命令複数データ処理手段と、を備え、
前記単一命令複数データ処理手段が、前記単一命令複数データレジスタファイル手段の入力オペランドレジスタ内に保持されたデータ要素のシーケンスを含むベクトルデータ値に対してさらなる処理操作を行って、前記単一命令複数データレジスタファイル手段の出力オペランドレジスタ内に記憶された出力オペランドを生成するように、さらなるプログラム命令によって制御され、
前記出力オペランドが、前記データ要素のシーケンス内のすべてのデータ要素に依存する値を持つ第１の部分を有する、データ処理装置。
【請求項２２】
データを処理する方法であって、
単一命令複数データオペランドを単一命令複数データレジスタファイル内に記憶するステップと、
単一命令複数データプログラム命令の制御下で、前記単一命令複数データレジスタファイルの入力オペランドレジスタ内の別個のレーン内に記憶された別個のデータ要素に対して独立して処理操作を行うステップと、
さらなるプログラム命令の制御下で、前記単一命令複数データレジスタファイルの入力オペランドレジスタ内に保持されたデータ要素のシーケンスを含む、ベクトルデータ値に対してさらなる処理操作を行って、前記単一命令複数データレジスタファイルの出力オペランドレジスタ内に記憶された出力オペランドを生成するステップと、を含み、  
前記出力オペランドが、前記データ要素のシーケンス内のすべてのデータ要素に依存する値を持つ第１の部分を有する、データを処理する方法。
【請求項２３】
前記さらなるプログラム命令が、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を持つ前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N-1));
{
Index=(I*32);
t1[31:0]=OP FUNC(X[63:32],X[95:64],X[127:96]);
Y[31:0]=Y[31:0]+ROL(X[31:1],5)+T1[31:0]+Vm[Index+31:Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y[31:0];
Y[31:0]=X[127:96];
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=X[127:0];
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転である、請求項２２に記載の方法。
【請求項２４】
前記さらなるプログラム命令が、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を持つ前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N-1));
{
Index=(I*32);
T1[31:0]=OP_FUNC(X[63:32],X[95:64],X[127:96]);
Y=Y+ROL(X[31:0],5)+T1[31:0]+Vm[(Index+31):Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y;
Y=X[127:96];
X[127:0]={X[95:0]:T2[31:0]};
}
Qdoutput[127:0]={0:Y[31:0]};
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転である、請求項２２に記載の方法。
【請求項２５】
前記さらなるプログラム命令が、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を持つ前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[127:0]=Qn[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=X[127:0];
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）  ＸＯＲ  ＲＯＲ（Ｂ，１３）  ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６）  ＸＯＲ  ＲＯＲ（Ｂ，１１）  ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、ＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である、請求項２２に記載の方法。
【請求項２６】
前記さらなるプログラム命令が、いずれも前記単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有し、前記ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、前記さらなる処理操作が、以下のステップにより得られるものと同一の値を持つ前記出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qn[127:0];
Y[127:0]=Qd[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=Y[127:0];
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）  ＸＯＲ  ＲＯＲ（Ｂ，１３）  ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６  ）ＸＯＲ  ＲＯＲ（Ｂ，１１）  ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、ＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である、請求項２２に記載の方法。
【請求項２７】
請求項１〜２１のいずれか１項に記載のデータ処理装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するために、コンピュータ記憶媒体上に記憶されたコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理システムの領域に関する。より具体的に、本発明は、データ処理システム内の暗号化サポート命令の提供に関する。
【背景技術】
【０００２】
データ処理システムを使用して、暗号化操作を行うことは既知である。そのような既知の暗号化処理操作の例としては、セキュアハッシュアルゴリズム（ＳＨＡ）が挙げられる。ＳＨＡは、ＳＨＡ‐１、ＳＨＡ‐２、ＳＨＡ２５６、およびＳＨＡ５１２を含む、多様な異なる既知の形態を有する。これらのアルゴリズムは、計算集約型である。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
これらのアルゴリズムをサポートする１つの既知のアプローチは、汎用命令を実行する汎用プロセッサを、その汎用レジスタファイルと共に使用することである。このアプローチの持つ問題は、これらのアルゴリズムを行う際に扱われる必要があり、通常、１６０ビット以上のハッシュ値を生成し得る大量の状態データのために、多くの場合、操作を分割して、データの一部に一度に作動する長いシーケンスの個別のプログラム命令によって行われる必要があり、それによりアルゴリズムを実行するために必要な時間量およびアルゴリズムを実行する際に消費されるエネルギーの不利益な増加を生じる結果を有することである。
【０００４】
別の既知のアプローチは、アルゴリズムを行うための専用回路を有し、通常、ポインタをハッシュされるデータの開始に渡し、次に得られるハッシュ値を受信するまで待機することによって始動される、暗号化コプロセッサ等の特殊用途の暗号化サポートプロセッサを提供することである。このアプローチの持つ問題は、特殊用途暗号化ハードウェアの提供によって、追加費用および複雑性が発生することである。さらに、特殊用途暗号化ハードウェアは、データ処理システムによる操作のそのような態様に対処するために、通常そのデータ処理システム内に提供される機構内に統合することが困難および複雑であるため、特殊用途ハードウェアの操作を、割り込み処理、マルチタスク等のデバイスの他の操作と統合する際に、問題が生じる。
【課題を解決するための手段】
【０００５】
一態様から見ると、本発明は、
単一命令複数データレジスタファイルと、
該単一命令複数データレジスタファイルに連結され、該単一命令複数データレジスタファイルの入力オペランドレジスタ内の別個のレーン内に記憶された別個のデータ要素に対して独立して処理操作を行うために、単一命令複数データプログラム命令によって制御されるように構成された、単一命令複数データ処理回路と、を備える、データ処理装置を提供し、
該単一命令複数データ処理回路が、該単一命令複数データレジスタファイルの入力オペランドレジスタ内に保持されたデータ要素のシーケンスを含むベクトルデータ値に対してさらなる処理操作を行って、前記単一命令複数データレジスタファイルの出力オペランドレジスタ内に記憶された出力オペランドを生成するために、さらなるプログラム命令によって制御されるように構成され、該出力オペランドが、該データ要素のシーケンス内のすべてのデータ要素に依存する値を持つ第１の部分を有する。
【０００６】
本技法は、多くのデータ処理システムには既に単一命令複数データ処理機構が提供されていることを認識する。そのような単一命令複数データ処理機構は、通常、典型的に単一命令複数データ処理に関与する、大きなデータ幅のオペランドを記憶及び操作することができる大きな記憶容量を有する、単一命令複数データレジスタファイルを含む。単一命令複数データ処理において、データの別個のレーンが、単一プログラム命令の制御下で独立して処理されるのが通常である。例えば、データの別個のレーンは、色画素値または他のベクトル値の成分値を含んでよく、すべての値がスケーリング等の同一処理操作に供される。本技法は、単一命令複数データレジスタファイルの記憶能力が、通常形態の単一命令複数データプログラム命令に従わないさらなるプログラム命令と共に再利用することができることを認識する。特に、レーンの処理は独立している必要はなく、生成された出力オペランドは、入力を形成するベクトルデータ値内のすべてのデータ要素に依存する値を持つ第１の部分を有してもよい。
【０００７】
単一命令複数データプログラム命令の領域の外側の単一命令複数レジスタファイルの再利用は、データ圧縮およびデータ暗号化等の多様な領域に適用されてよい。この手技は、特にデータ暗号化によく適している。
【０００８】
この文脈において、さらなるプログラム命令が、出力ハッシュ値を生成するために、データの連続ワードおよび中間ハッシュ値の少なくとも一部分を使い尽くす反復処理操作を行うように配置されてよい。ハッシュ値生成は、通常、異常に長いオペランド値を記憶および操作する能力を用いて、大量のデータおよびレジスタファイルの操作を必要とする。
【０００９】
さらなるプログラム命令の一形態は、該さらなるプログラム命令が、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有し、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップにより得られるものと同一の値を有する該出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N-l));
{
Index=(I*32);
t1[31:0]=OP FUNC(X[63:32],X[95:64],X[127:96]);
Y[31:0]=Y[31:0]+ROL(X[31:1],5)+T1[31:0]+Vm[Index+31:Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y[31:0];
Y[31:0]=X[127:96];
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=X[127:0];
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）ＡＮＤ  Ｂ）ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転であるものである。
【００１０】
この形態の反復プログラム命令は、ＳＨＡ−１アルゴリズムの実装によく適している。上に定義した操作は、疑似コードの形態で付与され、この技術分野における熟練者によってよく理解されるように、多様な異なるハードウェア形態で実装することができる。特に、低回路オーバーヘッド実装は、値を再循環させて反復操作を行ってよいが、より高い性能実装は、異なる反復の少なくとも一部分を平行して行うことを求める場合がある。
【００１１】
さらなるプログラム命令の別の形態は、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有し、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップにより得られるものと同一の値を有する該出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N-1));
{
Index=(I*32);
T1[31:0]=OP_FUNC(X[63:32],X[95:64],X[127:96]);
Y=Y+ROL(X[31:0],5)+T1[31:0]+Vm[(Index+31):Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y;
Y=X[127:96];
X[127:0]={X[95:0]:T2[31:0]};
}
Qdoutput[127:0]={0:Y[31:0]};
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）ＡＮＤ  Ｂ）ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転である。
【００１２】
ＯＰ  ＦＵＮＣにより評価される関数の選択は、さらなるプログラム命令内の特定のフィールドに依存して行われ得るか、またはハッシュされるデータ値の現在の入力ブロックの処理中に行われた反復の回数に依存して行われてもよい。
【００１３】
いくつかの実施形態において、単一命令複数データレジスタファイルは、単一のレジスタ内の第１の入力オペランドおよび第２の入力オペランドのすべてを記憶する能力を有していなくてもよく、したがって、これらは単一命令複数データレジスタファイル内の別個のレジスタ内に記憶され得る。他の実施形態において、第１の入力オペランドおよび第２の入力オペランドは、共有レジスタ内に記憶されてよく、単一の入力オペランドとして考慮されてもよい。
【００１４】
さらなる実施形態において、上記さらなるプログラム命令と併せて、または上記さらなるプログラム命令の代わりのいずれかで、本技法は、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有するさらなるプログラム命令のサポートを提供してもよく、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップにより得られるものと同一の値を有する該出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qd[127:0];
Y[127:0]=Qn[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31 :0]}
}
Qdoutput[127:0]=X[127:0];
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）ＡＮＤ  Ｂ）ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）ＸＯＲ  ＲＯＲ（Ｂ，１３）ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６）ＸＯＲ  ＲＯＲ（Ｂ，１１）ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、ＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である。
【００１５】
同様に、さらなるプログラム命令は、さらなるプログラム命令が、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有する形態を有してもよく、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップにより得られるものと同一の値を有する該出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
X[127:0]=Qn[127:0];
Y[127:0]=Qd[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=Y[127:0];
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）ＡＮＤ  Ｂ）ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）ＸＯＲ  ＲＯＲ（Ｂ，１３）ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６）ＸＯＲ  ＲＯＲ（Ｂ，１１）ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、ＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である。
【００１６】
さらなるプログラム命令の上記２つの形態は、ＳＨＡ‐２２４アルゴリズムおよびＳＨＡ２５６アルゴリズムのサポートによく適している。
【００１７】
さらなるプログラム命令の処理を管理するための機構（複数可）は、単一命令複数データ処理回路と便宜的に組み合わされてもよい。さらなる処理命令の処理を管理するための機構（複数可）は、単一命令複数データ命令レジスタファイルを使用し、さらなるプログラム命令の処理（例えば、割り込み処理、スケジューリング）を管理するための機構が、単一命令複数データ処理回路のそれと統合されるとき、実装を簡素化することができる。
【００１８】
単一命令複数データ処理回路のそれと統合され得るさらなるプログラム命令の処理を管理する態様は、レジスタリネーミング、命令スケジューリング、命令発行、命令リタイアおよび命令割込みを含む。単一命令複数データ処理回路は、通常、これらの操作を管理およびサポートする回路素子を既に含み、さらなるプログラム命令は、この管理サポートに比較的容易に統合され得る。これは、暗号化ハッシュ値の生成の途中で割込みが発生した場合、次に通常の割込み処理機構を使用して、その割込みに対処し、オーバーヘッドまたは複雑性がほとんど追加されることなく、割込みが対処された後にハッシュ計算を再開または継続し得るという利点を提供する。
【００１９】
アルゴリズムをハッシュするためのサポートは、入力オペランドＳｍ［３１：０］を有し、出力オペランドＳｄ［３１：０］を生成する回転命令に、Ｓｍ［３１：０］の２ビット位置だけの右回転により得られるものと同一の値を提供することによりさらに強化される。
【００２０】
中間ハッシュ値の生成に加えて行われるべき暗号化ハッシュアルゴリズムの処理の別の態様は、処理されているファイル内のデータ要素のスケジュールの更新である。このスケジュールの更新は、処理スループット内に不利益なボトルネックを導入しないように、ハッシュ生成を伴う作業負荷に関して均衡されるべきである。したがって、本発明のいくつかの実施形態は、該単一命令複数データ処理回路が、第１の入力オペランドＳｐ［１２７：０］および第２の入力オペランドＳｑ［１２７：０］を有し、以下のステップ、
T[127:0]={Sp[63:0]:Sq[127:64]}および
Sr[127:0]=T[127:0] XOR Sr[127:0] XOR Sq[127:0]
により得られるものと同一の値を持つ出力オペランドＳｒ［１２７：０］を生成する、第１のスケジュール更新命令によって制御されるように構成されることを提供する。
【００２１】
さらに、いくつかの実施形態は、該単一命令複数データ処理回路が、入力オペランドＳｓ［１２７：０］を有し、以下のステップ、
T[127:0]=St[127:0] XOR {32{0}:Ss[127:32]};
St[95:0]={T[94:64]:T[95]:T[62:32]:T[63]:T[30:0]:T[31]};および
St[127:96]=({T[126:96]:T[127]}) XOR ({T[29:0]:T[31:30]})
により得られるものと同一の値を持つ出力オペランドＳｔ［１２７：０］を生成する、第２のスケジュール更新命令によって制御されるように構成されることを提供する。
【００２２】
プログラム命令の上記２つの形態は、ＳＨＡ‐２５６およびＳＨＡ‐２２４アルゴリズムのサポートによく適している。
【００２３】
他の形態のハッシュアルゴリズムのスケジュール生成のサポートを助けるために、いくつかの実施形態では、該単一命令複数データ処理回路が、入力オペランドＳｐ［１２７：０］を有し、以下のステップ、
T[127:0]={Sp[31:0]:Sq[127:32]};
T[127:0]=VecROR32(T[127:0],7) XOR VecROR32(T[127:0],18] XOR VecROR32(T[127:0],3);および
Sq[127:0]=VecADD32(T[127:0],Sq[127:0])
により得られるものと同一の値を持つ出力オペランドＳｑ［１２７：０］を生成する、第１のスケジュール更新命令によって制御されるように構成されるようにし、ＶｅｃＲＯＲ３２（Ａ，Ｂ）は、Ａ内の各３２ビットワードのＢビット位置だけの別個の右回転であり、ＶｅｃＡＤＤ３２（Ａ，Ｂ）は、Ａ内の各３２ビットワードのＢ内の対応する３２ビットワードへの別個の追加である。
【００２４】
さらなる実施形態は、追加として、該単一命令複数データ処理回路が、第１の入力オペランドＳｐ［１２７：０］および第２の入力オペランドＳｑ［１２７：０］を有し、以下のステップ、
T0[127:0]={Sq[31:0]:Sp[127:32]};
T1[63:0]=Sq[127:64];
T1[63:0]=VecROR32(T1[63:0],17) XOR VecROR32(T1[63:0],19) XOR VecROR32(T1[63:0],10);
T3[63:0]=VecADD32(Sr[63:0],T0[63:0]);
T1[63:0]=VecADD32(T3[63:0],T1[63:0]);
T2[63:0]=VecROR32(T1[63:0],17) XOR VecROR32(T1[63:0],19) XOR VecROR32(T1[63:0],10);
T3[63:0]=VecADD32(Sr[127:64],T0[127:64]);および
Sr[127:0]={VecADD32(T3[63:0],T2[63:0]):T1[63:0]}
により得られるものと同一の値を持つ出力オペランドＳｒ［１２７：０］を生成する、第１のスケジュール更新命令によって制御されるように構成されることを提供し、ＶｅｃＲＯＲ３２（Ａ，Ｂ）は、Ａ内の各３２ビットワードのＢビット位置だけの別個の右回転であり、ＶｅｃＡＤＤ３２（Ａ，Ｂ）は、Ａ内の各３２ビットワードのＢ内の対応する３２ビットワードへの別個の追加である。
【００２５】
プログラム命令の上記２つの形態は、ＳＨＡ‐２５６アルゴリズムのサポートによく適している。
【００２６】
別の態様から見ると、本発明は、
単一命令複数データオペランドを記憶するための単一命令複数データレジスタファイル手段と、
単一命令複数データプログラム命令の制御下で処理操作を行うための単一命令複数データ処理手段であって、該単一命令複数データレジスタファイルに連結され、該処理操作が、該単一命令複数データレジスタファイル手段の入力オペランドレジスタ内の別個のレーン内に記憶された別個のデータ要素に対して独立して行われる、単一命令複数データ処理手段と、を備える、データ処理装置を提供し、
該単一命令複数データ処理手段は、さらなるプログラム命令によって、該単一命令複数データレジスタファイル手段の入力オペランドレジスタ内に保持されたデータ要素のシーケンスを含むベクトルデータ値に対してさらなる処理操作を行って、単一命令複数データレジスタファイル手段の出力オペランドレジスタ内に記憶された出力オペランドを生成するように制御され、該出力オペランドは、データ要素の該シーケンス内のすべてのデータ要素に依存する値を持つ第１の部分を有する。
【００２７】
さらなる態様から見ると、本発明は、以下のステップ、
単一命令複数データオペランドを単一命令複数データレジスタファイル内に記憶することと、
単一命令複数データプログラム命令の制御下で、該単一命令複数データレジスタファイルの入力オペランドレジスタ内の別個のレーン内に記憶された別個のデータ要素に対して独立して処理操作を行うことと、
さらなるプログラム命令の制御下で、該単一命令複数データレジスタファイルの入力オペランドレジスタ内に保持されたデータ要素のシーケンスを含むベクトルデータ値に対してさらなる処理操作を行って、該単一命令複数データレジスタファイルの出力オペランドレジスタ内に記憶された出力オペランドを生成することと、を含み、該出力オペランドが、データ要素の該シーケンス内のすべてのデータ要素に依存する値を持つ第１の部分を有する、データを処理する方法を提供する。
【００２８】
本発明の別の態様は、上に詳述されるデータ処理装置上で実行しているかのように、上に詳述されるプログラム命令が実行されるのを許可する汎用コンピュータ上に実行環境を提供する、仮想マシン実装の提供である。本技法のような仮想マシン実装は、本明細書に包含される。
【図面の簡単な説明】
【００２９】
ここで本発明の実施形態は、単なる例として、以下の添付の図面を参照して説明される。
【００３０】
【図１】暗号化処理命令の実行のサポートを含む、単一命令複数データレジスタファイルおよび単一命令複数データ処理回路を含むデータ処理装置を概略的に示す。
【図２】ハッシュアルゴリズムの一例示形態内のデータフローを概略的に示す。
【図３】さらなる処理命令が、単一命令複数データ処理回路と関連付けられた通常のレーンベース処理に従わない様子を概略的に示す。
【発明を実施するための形態】
【００３１】
図１は、操作されるデータおよび実行されるプログラム命令を記憶するメモリ６に連結する中央処理装置４の形態のデータ処理装置２を概略的に示す。中央処理装置４は、汎用レジスタファイル８と、汎用処理回路１０と、単一命令複数データレジスタファイル１２と、単一命令複数データ処理回路１４とを含む。汎用レジスタファイル８は、通常、低ビット幅汎用レジスタ（例えば、３２または６４ビット）、例えば、ARM Limited（Cambridge, England）により製造されたプロセッサの汎用レジスタファイルによりサポートされる形態のレジスタを含有する。単一命令複数データレジスタファイル１２は、通常、はるかに大きなレジスタを含み、単一命令複数データレジスタファイル１２内のデータ記憶は、用いられるレジスタサイズ指定子に依存する異なるレジスタを形成するために、異なる方法で分割されてよい。単一命令複数データレジスタファイル１２の形態は、ARM Limited（Cambridge, England）により製造されたプロセッサのいくつかの実装においてサポートされるＮｅｏｎレジスタファイルのそれであってもよい。
【００３２】
汎用レジスタリネーミングおよびスコアボーディング回路１６は、汎用レジスタファイル１０と関連付けられ、単一命令複数データレジスタリネーミングおよびスコアボーディング回路１８は、単一命令複数データレジスタファイル１２と関連付けられる。レジスタリネーミングおよびスコアボーディングは、それら自体が、本技術分野における従事者によく知られるであろう既知の技法であるため、本明細書ではさらに説明しない。レジスタリネーミングおよびスコアボーディングは、それらが通常の単一命令複数データ処理命令に対して提供されるのと同様に、以下でさらに説明される暗号化処理命令のサポートに利用されるレジスタに適用されてもよい。したがって、レジスタリネーミング、命令スケジューリング、命令発行、命令リタイア、および命令割込みをサポートするために既に提供されている機構は、暗号化サポートプログラム命令によって再利用されてよく、したがって、これらの暗号化サポート命令の操作は、中央処理装置４の全体操作とより良好に統合されてよい。
【００３３】
プログラム命令Ｉは、メモリ６から受信され、命令パイプライン２０に渡される。命令デコーダ２２は、プログラム命令をデコードし、レジスタファイル８、１２および処理回路１０、１４ならびに中央処理装置４内の他の素子の操作を制御する制御シグナルを生成する。割込み回路２４は、中央処理装置４によって現在おこなわれている処理に割り込むために外部的に生成された割込み信号ｉｎｔに応答して、当業者によく知られるように、割込み処理コードの実行を開始する。中央処理装置４は、通常、多くの追加の回路素子を含み、これらは、明確にするために、図１から省略されていることが理解されるであろう。
【００３４】
図２は、ハッシュ生成アルゴリズムの一形態内のデータフローを概略的に示す。ハッシュされるファイル２６は、６４バイトのブロック２８に分割され、さらに４つの３２ビットワードの入力ベクトルに分割されて、１つの入力としてハッシュアルゴリズム３０に供給される。ハッシュシード値３２もまた、ハッシュ操作の開始時に提供される。ハッシュ操作は、それぞれハッシュ更新３４およびスケジュール更新３６に関与する、２つの主要なプログラムループを用いる。これらの主要なループは、単一命令複数データ処理回路１４内の両方のループをサポートする特殊用途プログラム命令の提供によって均衡される。中間ハッシュ値３８は、ハッシュ更新ループ３４により生成され、ハッシュアルゴリズムが入力データのブロック２８の処理を継続するにつれてフィードバックされる。ブロック２８が処理されたとき（例えば、ＳＨＡ−１の場合、８０ハッシュ更新の反復に供される）、次に出力ハッシュ値４０は、現在の中間ハッシュ値３８をそれに追加することによって更新される。この処理は、ファイル２６のすべてが使い尽くされるまで繰り返される。これは、ファイル２６全体の結果ハッシュ値を生成する。
【００３５】
ハッシュ更新ループ３４は何度も実行され、それ自体が、以下に説明されるように、それぞれが自身の命令内反復を有する。スケジュール更新３６は、ハッシュ更新を均衡するように行われる。スケジュール更新は、以下に説明されるように、性能を向上させるためにベクトル化されてもよい。
【００３６】
図３は、本技法によるさらなる処理命令が、複数のデータ要素を含むベクトルデータ値４２をどのように受信するかを概略的に示す。次に、暗号化サポート命令は、このベクトルデータ値４２に対して処理操作を行って、ベクトルデータ値４２の第１のデータ要素およびベクトルデータ値内の２つ以上のさらなるデータ要素の両方に依存する、第１の部分４４を有する出力オペランドを生成する。この動作は、処理操作がレーンベースであり、異なるレーン内のデータ値の間に、もしあるとすれば、限定された反復がある、通常の単一命令複数データプログラム命令とは対照をなす。
【００３７】
本技法の一実装は、２つのアルゴリズム、すなわちＳＨＡ‐１およびＳＨＡ‐２５６を標的とする一式の命令である。命令は、ＳＨＡ‐２５６と同一の操作を必要とするＳＨＡ‐２２４アルゴリズムの利益にもなる。ＳＨＡアルゴリズムは、米国標準技術局（ＮＩＳＴ）により仕様が決められたセキュアハッシュアルゴリズムのファミリーである。これらのアルゴリズムの仕様は、公然と使用可能である。アルゴリズムは、通常、デジタルシステム内のデータの認証に使用される。
【００３８】
ＳＨＡアルゴリズムの高レベル操作を説明すること、およびＳＨＡ‐１およびＳＨＡ‐２５６アルゴリズムの疑似コードを含めることから開始する。
【００３９】
ＳＨＡアルゴリズムの高レベル操作（ＦＩＰＳ  １８０‐４として知られる）
【００４０】
アルゴリズムのそれぞれは、６４バイトのデータを処理し、ハッシュダイジェストを生成して、ＳＨＡ‐１の場合、これは１６０ビット長であり、ＳＨＡ‐２５６の場合、これは２５６ビット長である。６４バイトを超える長さのデータストリームは、６４バイトのブロックに分割される。ストリームまたはブロックが６４バイト長未満である場合、ブロックは、ＦＩＰＳ（連邦情報処理規格）１８０−４において仕様が決められるように、６４バイトに水増しされる。特に明記しない限り、アルゴリズムに関する以下の説明は、１ワードが３２ビットの符号なし整数値であると仮定する。ワードは、ビッグエンディアン形態の６４バイトのブロックからの４連続バイトのデータで構成されるものと仮定される。
【００４１】
両アルゴリズムは、ワーキングハッシュダイジェストを初期化することによって開始する。データのブロックが、所与のデータストリームの最初である場合、次にハッシュダイジェストは、固定されたシード値に初期化される。ブロックがデータストリームの連続である場合、ハッシュダイジェストは、前のブロックから計算されたハッシュダイジェストに初期化される。シード値は、ＦＩＰＳ１８０‐４において仕様が決められる。
【００４２】
アルゴリズムは、スケジュール更新操作を使用してブロックを拡張する。これは、ブロックを初期１６ワードのデータから、ＳＨＡ‐１の場合は８０ワード、およびＳＨＡ‐２５６の場合は６４ワードに拡張する。スケジュール更新操作は、固定した排他的論理和（ＸＯＲ）を使用して、スケジュールからの４つのワードを組み合わせ、シフトおよび回転させて、拡張されたスケジュール内の次のワードを生成する。初期１６ワードは、拡張されたスケジュール内で未変化のまま残される。
【００４３】
次に拡張されたスケジュール内の各ワードは、それに追加されたキー値を有する。ＳＨＡ−１においては、それぞれが拡張されたブロックからの一式の２０ワードに適用される、４個のキー定数がある。ＳＨＡ−２５６では、拡張されたブロックの各ワードに１つの６４個のキー定数がある。キー定数は、ＦＩＰＳ１８０−４において定義される。ブロックが拡張され、キー定数が追加された後、各ワードは、そのワードを一連の固定した排他的論理和（ＸＯＲ）を通じて、ハッシュダイジェストに統合、シフトおよび回転させる、ハッシュ更新関数を使用して処理される。
【００４４】
最後に、拡張されたブロックからの各ワードが、ハッシュ更新関数を使用して処理された後、ハッシュダイジェストが前のハッシュダイジェスト値に追加される。
【００４５】
ＦＩＰＳ１８０−４において仕様が決められるように、スケジュールは、一式の８０／６４ワード（ＳＨＡ−１／ＳＨＡ−２５６）、または１６ワードの円形キューのいずれかとして実装され得る。
【００４６】
完全性のために、円形キューを仮定するＳＨＡ−１およびＳＨＡ−２５６の疑似コードアルゴリズムが以下に示される。
【００４７】
ＳＨＡ‐１アルゴリズム疑似コード
【００４８】
uint32 w[0:15]=16 4-bytes (big-endian) input[];
uint32 wk[0:15]=w[0:15]+k[0:15];
uint32 a:e=io->hashes[0:4];
for round=0:63{
hash_update(round,wk[round]);
w[round]=schedule_update(round,w);
wk[round]=w[round]+k[round];
}
for round=64:79
hash_update(round,w[round]);
io->hashes[0:4]+=a:e;
【００４９】
ＳＨＡ−１ハッシュ更新コードは以下のとおりである。
hash_update(int round,uint32wk){
e+=FN(round,b,c,d)+ROL(a,5)+wk;
b=ROL(b,30);
rotate(a,b,c,d,e)to(e,a,b,c,d)
}
ここで、
if round<20,FN=choose(b,c,d);
else if round<40,FN=parity(b,c,d);
else if round<60,FN=majority(b,c,d);
else FN=Parity(b,c,d);
choose(b,c,d)=(((c^d)&b)^d)
parity(b,c,d)=(b^c^d)
majority(b,c,d)=(b&c)|((b|c)&d)
【００５０】
ＳＨＡ−１スケジュール更新コードは以下のとおりである。
uint32 schedule_update(int round,uint32 *w){
return ROR(w[round-3]^w[round-8]^w[round-14]^w[round-16],31);
}
【００５１】
ＳＨＡ‐２５６アルゴリズム疑似コード
【００５２】
uint32a:h=io->hashes[0:7];
uint32w[0:15]=16 4-bytes (big-endian) input[0:63];
uint32wk[0:15]=w[0:15]+k[0:15];
for round=0:47{
hash_update(wk[round]);
w[round]=schedule_update(round,w);
wk[round]=w[round]+k[round];
}
for round=48:63
hash_update(wk[round]);
io->hashes[0:7]+=a:h;
【００５３】
ＳＨＡ‐２５６ハッシュ更新コードは以下のとおりである。
hash_update(uint32wk){
t=h+Sigma1(e)+Choose(e,f,g)+wk;
d+=t;
h=t+Sigma0(a)+Majority(a,b,c);
rotate(a,b,c,d,e,f,g,h)to(h,a,b,c,d,e,f,g);
}
ここで、
Sigma0(x)=ror(x,2)^ror(x,13)^ror(x,22);
Sigma1(x)=ror(x,6)^ror(x,11)^ror(x,25);
Choose(b,c,d)=(((c^d)&b)^d)
Majority(b,c,d)=((b&c)|((b|c)&d)
【００５４】
同様に、ＳＨＡ−２５６スケジュール更新疑似コードは以下のとおりである。
uint32 schedule_update(int round,uint32 *w){
return w[round]+sigma1(w[round-2])+w[round-7]+sigma0(w[round-15]);
}
ここで、
sigma0(x)=ror(x,7)^ror(x,18)^shr(x、3);
sigma1(x)=ror(x,17)^ror(x,19)^shr(x,10);
【００５５】
ＳＨＡアルゴリズム作業中（ＦＩＰＳ１８０‐４明細書に由来し得る）
【００５６】
それらを加速するために取られるアプローチを制約するＳＨＡアルゴリズムの一態様は、データのブロックを処理するために必要な作業中の量である（前述のとおり）。この状態を保持および操作する単一命令複数データレジスタファイルの能力は、この制約に対処する。
【００５７】
以下の表は、ＳＨＡ−１およびＳＨＡ−２５６の状態要件を概説する。
【表１】
2015501946.tif 000003
【表２】
2015501946.tif 000004
【００５８】
ＳＨＡ−１またはＳＨＡ−２５６アルゴリズムのいずれかを使用して、データのブロックを処理することができる専用ＳＨＡ装置を（例えば、コプロセッサとして）構築することは、固定した目的状態への投資を必要とする。この状態は、ＲＩＳＣマイクロプロセッサ上の他の操作により容易に使用することができなかった。
【００５９】
ＳＨＡアルゴリズムを三元形態のＲＩＳＣ命令に分ける
【００６０】
固定した目的状態を避けるために、アルゴリズムが、三元命令形態を観察し、単一命令複数データ処理回路およびレジスタファイルを使用する、ＲＩＳＣマイクロプロセッサ上で処理され得るような方法でアルゴリズムを分割した。
【００６１】
ＲＩＳＣ三元形態の通常の制約は、３つのレジスタのうちの１つのみが宛先として定義されることである。しかしながら、宛先はソースとして使用され得る。
【００６２】
汎用レジスタを使用して可能となるよりも、１つの命令当たり多くのデータを処理することができるように、ＳＩＭＤレジスタを使用する。
【００６３】
三元命令形態を観察することによって、命令は、現代のマイクロプロセッサに共通するリネーム、スケジューリング、発行、結果、およびリタイア論理を使用することができる。
【００６４】
すべての状態および依存性が命令により定義されると、異常な実行、割込み、および憶測を扱うパイプライン機構は依然として有効であり、提示された命令の適切な実行を維持するために追加の制御論理は必要とされない。
【００６５】
ＳＨＡ−１ハッシュ更新命令
【００６６】
ＳＨＡ−１ハッシュ更新関数は、前述されるように、３２ビットワードを１６０ビットハッシュダイジェストに統合する。関数は、固定したシフト、固定したＸＯＲ／ＡＮＤ／ＯＲ、ならびに固定した回転で構成される。
hash_update(int round,uint32 wk){
e+=FN(round,b,c,d)+ROL(a,5)+wk;
b=ROL(b,30);
rotate(a,b,c,d,e)to(e,a,b,c,d)
}
ここで、
if round<20,FN=choose(b,c,d);
else if round<40,FN=parity(b,c,d);
else if round<60,FN=majority(b,c,d);
else FN=Parity(b,c,d);
choose(b,c,d)=(((c^d)&b)^d)
parity(b,c,d)=(b^c^d)
majority(b,c,d)=(b&c)|((b|c)&d)
【００６７】
ＳＨＡ‐１ハッシュダイジェストは、１６０ビットであり、したがって、全体ダイジェストプラス３２ビットワード上で動作する操作は、３２ビット汎用三元ＲＩＳＣ形態においては不可能であり、６４ビット汎用三元ＲＩＳＣ形態で実現するために相当の労力を要し、３２ビットデータ値を高３２ビットの第３の６４ビットオペランドに挿入するために、さらなるハウスキーピング処理が必要とされる。
【００６８】
この理由で、この例示の技法は、ＳＨＡ−１ハッシュ関数を一式の４つの先進ＳＩＭＤ命令ＳＨＡ１Ｃ、ＳＨＡ１Ｐ、ＳＨＡ１Ｍ、およびＳＨＡ１Ｈにマップする。
SHA1C Qd,Sn,Vm.4S[OP=C,OP_FUNC=choose]
SHA1P Qd,Sn,Vm.4S[OP=P,OP_FUNC=parity]
SHA1M Qd,Sn,Vm.4S[OP=M,OP_FUNC=majority]
SHA1H Sd,Sn
【００６９】
命令ＳＨＡ１Ｃ、ＳＨＡ１Ｐ、およびＳＨＡ１Ｍは、３つのオペランドを取る。Ｑｄは、ダイジェストハッシュの最初の４つの３２ビットワードを保持し、Ｓｎは５番目を保持する。第３のオペランドＶｍは、最初の実施形態において、４つの３２ビットワードを保持するベクトルである。これは、ハッシュ更新関数の４つの反復が命令により処理されることを許可する。疑似コードは、これらの命令の操作を以下に示されるように定義する。疑似コードに関する命令の操作を定義することは、当業者によく知られるところとなり、疑似コードが一旦定義されると、その疑似コードにより定義された命令を行う（実行する）ための回路の実現はルーチンであることが理解されるであろう。
SHA1<OP>Qd,Sn,Vm.4S
X=Qd;
Y=Sn;
for (i=0 to 3)
{
Index=(i*32);
t1<31:0>=OP_FUNC(X<63:32>,X<95:64>,X<127:96>);
Y=Y+ROL(X<31:0>,5)+t1(<31:0>+Vm<(index+31):index>;
X<63:32>=ROL(X<63:32>,30);
// Rotate
t2<31:0>=Y;
Y=X<127:96>;
X<127:0>={X<95:0>:t2<31:0>};
}
Qd=X;
【００７０】
したがって、例示の実施形態によれば、単一命令複数データ処理回路は、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有する、さらなるプログラム命令によって制御されるように構成され、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップ、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N-1));
{
Index=(I*32);
t1[31:0]=OP FUNC(X[63:32],X[95:64],X[127:96]);
Y[31:0]=Y[31:0]+ROL(X[31:1],5)+T1[31:0]+Vm[Index+31:Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y[31:0];
Y[31:0]=X[127:96];
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=X[127:0]
により得られるものと同一の値を持つ出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）ＡＮＤ  Ｂ）ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転である。
【００７１】
これらの命令の別の実現は、ｃｈｏｏｓｅ（）、ｐａｒｉｔｙ（）、およびｍａｊｏｒｉｔｙ（）関数の中から選択するための選択を伴う。
SHA1HASH Qd,Sn,Vm.4S,#OP //＃ＯＰは、＃１はＣを選択し、＃２はＰを選択し、＃３はＭを選択する。
【００７２】
ＲＩＳＣ命令形態の制約は、ハッシュダイジェストの最初の４ワードのみが、ＳＨＡ１Ｃ、ＳＨＡ１Ｐ、およびＳＨＡ１Ｍ命令を１２８ビットレジスタＱｄに戻され得ることである。したがって、命令ＳＨＡ１Ｈは、ハッシュダイジェストの５番目のワードを戻すことが提案される。
【００７３】
最初の実現において、ＳＨＡ１Ｈは、以下のとおり実装される。
SHA1H Sd,Sn
Sd=ROR(Sn,2);
【００７４】
以下は、４つの反復後の５番目のハッシュダイジェスト値がＱｄ［０］の初期値上の回転であるという観察である。
【００７５】
ＳＨＡ１ハッシュ更新命令の変形
【００７６】
ＳＨＡ１Ｃ、ＳＨＡ１Ｐ、およびＳＨＡ１Ｍ命令の変形は、本技法の他の変形によって拡張され得、Ｖｍ．８ＳまたはＶｍ．ｌ６Ｓオペランドを許可する。これらの変形は、本技法内に含まれる。これは、単一の命令内でハッシュ関数の８および１６個の反復の処理を許可する。つまり、ハッシュ更新関数は、２０反復毎に変えることが必要であるため、Ｖｍ．４Ｓ変形は依然として必要となる。
【００７７】
一例として、ＳＨＡ１＜ＯＰ＞Ｖｍ．８Ｓ変形は、以下のとおりである。
SHA1<OP>Qd,Sn,Vm.8S
X=Qd;
Y=Sn;
for (i=0 to 7)
{
Index=(i*32);
t1<31:0>=OP_FUNC(X<63:32>,X<95:64>,X<127:96>);
Y=Y+ROL(X<31:0>,5)+t1<31:0>+Vm<(index+31):index>;
X<63:32>=ROL(X<63:32>,30);
// Rotate
t2<31:0>=Y;
Y=X<127:96>;
X<127:0>={X<95:0>:t2<31:0>};
}
Qd=X;
【００７８】
８および１６個の反復（Ｖｍ．８ＳおよびＶｍ．１６Ｓ）上で操作する変形は、追加として、ＳＨＡ１Ｃ２、ＳＨＡ１Ｐ２、およびＳＨＡ１Ｍ２命令を必要とする。これらは、８および１６個の反復後のハッシュダイジェストにおける５番目のワードに適切な値を生成する。これらの新たな命令は、ＳＨＡ１Ｃ、ＳＨＡ１Ｐ、およびＳＨＡ１Ｍ命令と類似の方法で実装されるが、Ｑｄレジスタ内の５番目のダイジェストワードを戻し、例えば、以下のとおりである。
SHA1<OP>2 Qd,Sn,Vm.8S
X=Qd;
Y=Sn;
for (i=0 to 3)
{
Index=(i*32);
t1<31:0>=OP_FUNC(X<63:32>,X<95:64>,X<127:96>);
Y=Y+ROL(X<31:0>,5)+t1<31:0>+Vm<(index+31):index>;
X<63:32>=ROL(X<63:32>,30);
// Rotate
t2<31:0>=Y;
Y=X<127:96>;
X<127:0>={X<95:0>:t2<31:0>};
}
Qd={0:Y<31:0>}
【００７９】
したがって、例示の実施形態によれば、単一命令複数データ処理回路は、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＳｎ［３１：０］を有する、さらなるプログラム命令によって制御されるように構成され、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップ、
X[127:0]=Qd[127:0];
Y[31:0]=Sn[31:0];
for (I=0 to (2N-1))
{
Index=(I*32);
T1[31:0]=OP_FUNC(X[63:32],X[95:64],X[127:96]);
Y=Y+ROL(X[31:0],5)+T1[31:0]+Vm[(Index+31):Index];
X[63:32]=ROL(X[63:32],30);
T2[31:0]=Y;
Y=X[127:96];
X[127:0]={X[95:0]:T2[31:0]};
}
Qdoutput[127:0]={0:Y[31:0]};
により得られるものと同一の値を有する、該出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
式中、ＯＰ  ＦＵＮＣ（Ｂ，Ｃ，Ｄ）が、
（（（Ｃ  ＸＯＲ  Ｄ）ＡＮＤ  Ｂ）ＸＯＲ  Ｄ）、
（Ｂ  ＸＯＲ  Ｃ  ＸＯＲ  Ｄ）、および
（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）ＡＮＤ  Ｄ）のうちの１つであり、かつ
ＲＯＬ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの左回転である。
【００８０】
命令の他の変形は、より広いＳＩＭＤデータパスが使用可能である場合に、全体ハッシュダイジェストをｏｃｔワード（８×３２ワード）に戻すことが実現され得る。 
SHA1<OP>Od,Vn.4S
SHA1<OP>Od,Vn.8S
【００８１】
これらの命令は、ハッシュ関数の４および８個の反復を生成する。
【００８２】
ＳＨＡ１ハッシュ更新マイクロアーキテクチャオプション
【００８３】
これらの命令のマイクロアーキテクチャ実装について、様々なオプションが存在する。これらの命令の高性能実現は、反復論理のいくつかを構築し、より並列化された実行を行うことを選択し得る。
【００８４】
マイクロアーキテクチャは、マルチサイクル段階を用いて、一時的なパイプライン状態、およびしたがって電力消費を低減することを選択することができる。
【００８５】
中間演算は、桁上げ保存形態で行うことができる。
【００８６】
より広範な変形において、明示的なＳＨＡ１＜ＯＰ＞２命令が必要とされ得る場合、ＳＨＡ１＜ＯＰ＞２操作が対応するＳＨＡ１＜ＯＰ＞関数に従うときを検出することが可能であり得る。そのような場合、第２の計算を防ぎ、データパスからの結果を単に転送することが可能である必要がある。これは、パイプライン内のいくつかの一時的な状態を必要とする。
【００８７】
ＳＨＡ１スケジュール更新命令
【００８８】
ＳＨＡ１アルゴリズムからのスピードアップを実現することは、ハッシュ更新関数とスケジュール更新関数との間の均衡を必要とする。
【００８９】
ＳＨＡ‐１スケジュール更新関数は、前述されるように、データスケジュールからの４つの３２ビットワードを単一の結果ワードに統合して、スケジュールを拡張するか、または円形キューの場合は、スケジュール内のワードを上書きする。
【００９０】
スケジュール更新操作は、ＸＯＲおよび固定した回転からなる。
uint32 schedule_update(int round,uint32 *w){
return ROR(w[round-3]^w[round+8]^w[round-14]^w[round-16],31);
}
または円形キュー形態において、
void schedule_update(int round,uint32 w[0..15]){
w[round]=ROR(w[round+13mod16]^w[round+8mod16]^w[round+2mod16]^w[round],31);
}
【００９１】
操作は４つの入力値を必要とし、それらのうちの１つは破壊的である。これは、汎用３２三元ＲＩＳＣ形態には適合しない。
【００９２】
スケジュール更新命令は、ＡＲＭ先進ＳＩＭＤアーキテクチャにより提供されてもよい。メモリの負荷および記憶を回避するために、ＦＩＰＳ１８０‐４に説明される、スケジュール更新の円形キュー形態を効率的に実行する命令を実装することを選択した。
【００９３】
完全性のために、スケジュール更新のためのベクトル化法を含める。
【００９４】
ＳＨＡ−１スケジュール更新のベクトル化および置換
【００９５】
これは、ｗ［ｒｏｕｎｄ］、ｗ［ｒｏｕｎｄ＋１ｍｏｄ１６］、およびｗ［ｒｏｕｎｄ＋２ｍｏｄ１６］が並行して処理され得るという観察に従う。ｗ［ｒｏｕｎｄ＋３ｍｏｄ１６］の計算においては、ｗ［ｒｏｕｎｄ］への依存があり、４方向ベクトル化への直接経路を防ぐ。
w[round]=ROR(w[round+13]^w[round+8]^w[round+2]^w[round]),31);
w[round+1]=ROR(w[round+14]^w[round+9]^w[round+3]^w[round+1]),31);
w[round+2]=ROR(w[round+15]^w[round+10]^w[round+4]^w[round+2]),31);
w[round+3]=ROR(w[round]^w[round+11]^w[round+5]^w[round+3]),31);
【００９６】
この制限は、ｗ［ｒｏｕｎｄ＋３ｍｏｄ１６］の計算において、ｗ［ｒｏｕｎｄ］の値をゼロで置換し、結果を追加のＸＯＲおよび回転ステップで手直しすることにより解決することができ、これは以下に示される。
w[round]=ROR(w[round+13]^w[round+8]^w[round+2]^w[round]),31);
w[round+1]=ROR(w[round+14]^w[round+9]^w[round+3]^w[round+1]),31);
w[round+2]=ROR(w[round+15]^w[round+10]^w[round+4]^w[round+2]),31);
w[round+3]=ROR(0^w[round+11]^w[round+5]^w[round+3]),31);
w[round+3]=w[round+3]^ROR(w[round],31);
【００９７】
上記コードのブロックは、４×３２ビットのデータパスサイズを持つＳＩＭＤアーキテクチャ上の４レーンベクトル操作を利用するためにリファクタリングすることができる。
【００９８】
ＳＨＡ‐１スケジュール更新およびハッシュ更新の均衡
【００９９】
スケジュール更新操作をハッシュ更新操作と均衡させるために、スケジュール更新は、前述されるように、すなわち、４方向ベクトル化を使用して処理される。これは、後次のハッシュ関数命令のために、単一のスケジュール更新が十分なデータ、４×３２ビットワードを生成することを許可する。
【０１００】
ベクトル化技法は、妥当なＳＩＭＤ実装において、提案されたＳＨＡ−１ハッシュ関数を実行するために要するよりも多くの実行サイクルを要してスケジュールデータを計算する。
【０１０１】
これには多くの理由がある。
要素｛ｒｏｕｎｄ＋２，ｒｏｕｎｄ＋３，ｒｏｕｎｄ＋４，ｒｏｕｎｄ＋５｝を含有するベクトルは、恐らく２つのベクトルレジスタにまたがる。
要素｛ｒｏｕｎｄ＋１３，ｒｏｕｎｄ＋１４，ｒｏｕｎｄ＋１５，０｝を含有するベクトルは、１つのベクトルレジスタおよびゼロベクトルから抜き取る必要がある。
ＳＩＭＤベクトル回転は、ＳＩＭＤ命令セット、例えば、ＡＲＭ先進ＳＩＭＤにおいて共通して見出されない。そのため、ベクトル回転は、２つのベクトルシフトおよび１つのＯＲ命令を必要とする。
アムダールの法則に起因して、ＳＨＡ−１アルゴリズムの両方の部分は均衡される必要があり、そうでなければより遅い部分が、達成可能なスピードアップの量を制限する。
【０１０２】
この観察は、ＳＨＡ−１スケジュール更新関数を加速するための以下のＳＩＭＤ命令に至った。
SHA1SU0 Vd.4S,Vn.4S,Vm.4S
T<127:0>=Vn<63:0>:Vd<127:64>
Vd=T XOR Vd XOR Vm
SHA1SU1 Vd.4S,Vn.4S
T<127:0>=Vd XOR {32{0}:Vn<127:32>};
Vd<95:0>=T<94:64>:T<95>:T<62:32>:T<63>:T<30:0>:T<31>;
Vd<127:96>=(T<126:96>:T<127>)XOR(T<29:0>:T<31:30>);
命令は、円形キューが、４つの４×３２ビットベクトルレジスタ内に常駐すると仮定する。
【０１０３】
要素の並べ替えは、命令の中に引き入れられる。これは、効果的に要素の並べ替えを自由にし、それらはマイクロアーキテクチャ内の単なるワイヤである。
【０１０４】
固定した回転も単なるワイヤである。
【０１０５】
命令は均衡され、大部分のマイクロアーキテクチャにおいて極めて低いサイクル待ち時間を有してよく、それらは連続する２つのＸＯＲと、ワイヤリングとを備える。
【０１０６】
したがって、例示の実施形態によれば、単一命令複数データ処理回路は、第１の入力オペランドＳｐ［１２７：０］および第２の入力オペランドＳｑ［１２７：０］を有し、以下のステップ、
T[127:0]={Sp[63:0]:Sq[127:64]}
および
Sr[127:0]=T[127:0] XOR Sr[127:0] XOR Sq[127:0]
によって得られるものと同一の値を持つ出力オペランドＳｒ［１２７：０］を生成する、第１のスケジュール命令によって制御されるように構成される。
【０１０７】
ＳＨＡ‐２アルゴリズムを標的とする命令
【０１０８】
ＳＨＡ‐１アルゴリズムに対して提案された命令に関する論考において概説された機能の多くは、ＳＨＡ−２アルゴリズムに対して等しく適用する。このセクションは、ＳＨＡ−２アルゴリズムに対して提案された命令の差異を説明する。
【０１０９】
ＳＨＡ‐２ハッシュ更新命令
【０１１０】
ＳＨＡ‐１について概説された理由で、ＳＨＡ‐２ハッシュ更新関数は、２つのハッシュ更新命令によって対象とされる。
【０１１１】
ＳＨＡ‐２アルゴリズムのワーキングハッシュダイジェストは、２５６ビットまたは５１２ビットのいずれかである。２５６ビットのワーキングハッシュを有する、アルゴリズムＳＨＡ‐２５６およびＳＨＡ‐２２４は、本発明の初期実現に含まれるため、以下はそれらに焦点を当てている。後のセクションにおいて、本技法がＳＨＡ‐５１２、ＳＨＡ‐３８４、ＳＨＡ‐５１２／２５６、およびＳＨＡ‐５１２／２２４にいかに当てはまるかについて論じる。
【０１１２】
ＳＨＡ‐２５６ハッシュ更新命令
【０１１３】
ＳＨＡ‐２５６（およびＳＨＡ‐２２４）のワーキングハッシュダイジェストは、２５６ビット長である。１２８ビットのレジスタ幅を持つＳＩＭＤアーキテクチャにおいて、ハッシュダイジェスト上の任意の操作の結果は、２つの命令を必要とし、１つ目は最初の４×３２ビットワードを戻すことであり、２つ目は残りの４×３２ビットワードを戻すことである。
【０１１４】
ＳＨＡ‐１とは異なり、ＳＨＡ‐２ハッシュ更新関数は固定され、所与の数の反復後に変更しないため、２つの命令のみを必要とする。
【０１１５】
SHA256H Qd,Qn,Vm.4S
X=Qd;
Y=Qn;
for (i=0 to 3)
{
index=(i*32);
tCh<31:0>=Choose(Y<31:0>,Y<63:32>,Y<95:64>);
tMaj<31:0>=Majority(X<31:0>,X<63:32>,X<95:64>);
t1<31:0>=Y<127:96>+Sigma1(Y<31:0>)+tCh<31:0>+Vm<(index+31:index>;
X<127:96>=t1<31:0>+X<127:96>;
Y<127:96>=t1<31:0>+Sigma0(X<31:0>)+tMaj<31:0>;
t2<31:0>=Y<127:96>;
Y<127:0>=Y<95:0>:X<127:96>;
X<127:0>=X<95:0>:t2<31:0>;
}
Qd=X;
【０１１６】
したがって、例示の実施形態によれば、単一命令複数データ処理回路は、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有する、さらなるプログラム命令によって制御されるように構成され、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップ、
X[127:0]=Qd[127:0];
Y[127:0]=Qn[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=X[127:0];
により得られるものと同一の値を有する該出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）  ＸＯＲ  ＲＯＲ（Ｂ，１３）  ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６）  ＸＯＲ  ＲＯＲ（Ｂ，１１）  ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、ＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である。
【０１１７】
SHA256H2 Qd,Qn,Vm.4S
X=Qn;
Y=Qd;
for (i=0 to 3)
{
index=（i*32）;
tCh<31:0>=Choose(Y<31:0>,Y<63:32>,Y<95:64>);
tMaj<31:0>=Majority(X<31:0>,X<63:32>,X<95:64>);
t1<31:0>=Y<127:96>+Sigma1(Y<31:0>)+tCh<31:0>+Vm<(index+31):index>;
X<127:96>=t1<31:0>+X<127:96>;
Y<127:96>=t1<31:0>+Sigma0(X<31:0>)+tMaj<31:0>;
t2<31:0>=Y<127:96>;
Y<127:0>=Y<95:0>:X<127:96>;
X<127:0>=X<95:0>:t2<31:0>;
}
Qd=Y;
【０１１８】
したがって、例示の実施形態によれば、単一命令複数データ処理回路は、いずれも該単一命令複数データレジスタファイルから読み取られた第１の入力オペランドＱｄ［１２７：０］および第２の入力オペランドＱｎ［１２７：０］を有する、さらなるプログラム命令によって制御されるように構成され、該ベクトルデータ値が、Ｖｍ［Ｉｎｄｅｘ＋３１：Ｉｎｄｅｘ］を含み、Ｉｎｄｅｘが、０〜２Ｎであり、Ｎが、正の整数であり、該さらなる処理操作が、以下のステップ、
X[127:0]=Qn[127:0];
Y[127:0]=Qd[127:0];
for (I=0 to (2N-1));
{
Index=(I*32);
TCh[31:0]=Choose(Y[31:0],Y[63:32],Y[95:64]);
TMaj[31:0]=Majority(X[31:0],Y[63:32],Y[95:64]);
T1[31:0]=Y[127:96]+Sigma1(Y[31:0])+TCh[31:0]+Vm[Index+31:Index];
X[127:96]=T1[31:0]+X[127:96];
Y[127:96]=T1[31:0]+Sigma0(X[31:0])+TMaj[31:0];
T2[31:0]=Y[127:96];
Y[127:0]={Y[95:0]:X[127:96]};
X[127:0]={X[95:0]:T2[31:0]}
}
Qdoutput[127:0]=Y[127:0];
により得られるものと同一の値を有する該出力オペランドＱｄｏｕｔｐｕｔ［１２７：０］を生成し、
式中、Ｃｈｏｏｓｅ（Ｂ，Ｃ，Ｄ）が、（（（Ｃ  ＸＯＲ  Ｄ）  ＡＮＤ  Ｂ）  ＸＯＲ  Ｄ）であり、Ｍａｊｏｒｉｔｙ（Ｂ，Ｃ，Ｄ）が、（（Ｂ  ＡＮＤ  Ｃ）ＯＲ（（Ｂ  ＯＲ  Ｃ）  ＡＮＤ  Ｄ））であり、Ｓｉｇｍａ０（Ｂ）が、（ＲＯＲ（Ｂ，２）  ＸＯＲ  ＲＯＲ（Ｂ，１３）  ＸＯＲ  ＲＯＲ（Ｂ，２２））であり、Ｓｉｇｍａ１（Ｂ）が、（ＲＯＲ（Ｂ，６）  ＸＯＲ  ＲＯＲ（Ｂ，１１）  ＸＯＲ  ＲＯＲ（Ｂ，２５））であり、かつＲＯＲ（Ｐ，Ｑ）が、値ＰのＱビット位置だけの右回転である。
【０１１９】
ＳＨＡ２５６Ｈは、Ｑｄ内のハッシュダイジェストの最初の４×３２ビットワード、Ｑｎ内の残りの４×３２ビットワード、およびＶｍ．４Ｓ内のスケジュールデータの４×３２ビットワードを予想する。
【０１２０】
ＳＨＡ２５６Ｈ２は、Ｑｄ内のハッシュダイジェストの第２の４×３２ビットワード、Ｑｎ内の最初の４×３２ビットワード、およびＶｍ．４Ｓ内のスケジュールデータの４×３２ビットワードを予想する。
【０１２１】
ＳＨＡ２５６Ｈは、ハッシュダイジェストの最初の４×３２ビットワードを破壊するため、正しい値がＱｎ内のＳＨＡ２５６Ｈ２に渡され得るように、ＳＨＡ２５６Ｈを実行する前にコピーを取らなければならないことに留意されたい。
【０１２２】
ＳＨＡ‐２５６ハッシュ更新命令の変形
【０１２３】
ＳＨＡ−１ハッシュ更新命令について前に概説されるように、より広いベクトルＳＩＭＤのＳＨＡ−２５６命令の変形は、以下を含み得る。
SHA256(H|H2)Qd,Qn,Vm.8S
SHA256(H|H2)Qd,Qn,Vm.16S
【０１２４】
これらの命令は、８および１６反復のハッシュ更新関数をそれぞれ処理する。より広いＳＩＭＤデータパスは、以下も許可し得る。
SHA256H Od,Vm.8S
SHA256H Od,Vm.16S
式中、Ｏｄは、２５６ビット幅のレジスタであり、ＳＨＡ２５６Ｈ２操作を提供する必要はなく、全体ハッシュダイジェストは、ベクターレジスタに適合する。
【０１２５】
ＳＨＡ‐２５６スケジュール更新
【０１２６】
前に概説されるように、ＳＨＡ‐１の場合、ＳＨＡ‐２５６アルゴリズムからスピードアップを実現することは、ハッシュ更新関数とスケジュール更新関数との間の均衡を必要とする。
【０１２７】
ＳＨＡ‐２５６スケジュール更新関数は、データスケジュールからの４つの３２ビットワードを単一の結果ワードに統合して、スケジュールを拡張するか、または円形キューの場合は、スケジュール内のワードを上書きするかのいずれかである。
【０１２８】
スケジュール更新操作は、ＸＯＲ、固定したシフト、および固定した回転（既知）からなる。
uint32 schedule_update(int round,uint32 *w){
return w[round]+sigma1(w[round-2])+w[round-7]+sigma0(w[round-15]);
}
式中、
sigma0(x)=ror(x,7)^ror(x,18)^shr(x,3);
sigma1(x)=ror(x,17)^ror(x,19)^shr(x,10)
これは、円形キュー（既知）において表現することもできる。
void schedule_update(int round,uint32 *w){
w[round]=sigma1(w[round+14mod16])+w[round+9mod16]+sigma0(w[round+1mod16]);
}
【０１２９】
ＳＨＡ‐２５６スケジュール更新のベクトル化および置換
【０１３０】
ＳＨＡ‐２５６スケジュール更新関数は、４方向ＳＩＭＤに適した様式でベクトル化することもできる。
w[round]=sigma1(w[round+14])+w[round+9]+sigma0(w[round+1]);
w[round+1]=sigma1(w[round+15])+w[round+10]+sigma0(w[round+2]);
w[round+2]=sigma1(w[round])+w[round+11]+sigma0(w[round+3]);
w[round+3]=sigma1(w[round+1])+w[round+12]+sigma0(w[round+4]);
【０１３１】
２つの依存性、すなわちｗ［ｒｏｕｎｄ］およびｗ［ｒｏｕｎｄ＋１］が存在することに留意されたい。ＳＨＡ−２５６の置換方法は、ゼロ値で置換し、結果を手直しすることにより前述のとおり動作する。この方法は、以下のように示される。
w[round]=sigma1(w[round+14])+w[round+9]+sigma0(w[round+1]);
w[round+1]=sigma1(w[round+15])+w[round+10]+sigma0(w[round+2]);
w[round+2]=sigma1(w[0])+w[round+11]+sigma0(w[round+3]);
w[round+3]=sigma1(w[0])+w[round+12]+sigma0(w[round+4]);
w[round+2]+=sigma1(w[round]);
w[round+3]+=sigma1(w[round]);
【０１３２】
上記コードのブロックは、４×３２ビットのデータパスサイズを持つＳＩＭＤアーキテクチャ上の４レーンベクトル操作を利用するためにリファクタリングすることができる。
【０１３３】
ＳＨＡ‐２５６スケジュール更新およびハッシュ更新の均衡
【０１３４】
スケジュール更新操作をハッシュ更新操作と均衡させるために、前述されるように、すなわち、４方向ベクトル化を使用して、スケジュール更新を処理することを提案する。これは、後次のハッシュ関数命令のために、単一のスケジュール更新が十分なデータ、４×３２ビットワードを生成することを許可する。
【０１３５】
ベクトル化技法は、妥当なＳＩＭＤ実装において、提案されたＳＨＡ−１ハッシュ関数を実行するために要するよりも多くの実行サイクルを要してスケジュールデータを計算する。
【０１３６】
これには多くの理由がある。
要素｛ｒｏｕｎｄ＋１，ｒｏｕｎｄ＋２，ｒｏｕｎｄ＋３，ｒｏｕｎｄ＋４｝および｛ｒｏｕｎｄ＋９，ｒｏｕｎｄ＋１０，ｒｏｕｎｄ＋１１，ｒｏｕｎｄ＋１２｝を含有するベクトルは、複数のベクトルレジスタにまたがる。
｛ｒｏｕｎｄ＋１４，ｒｏｕｎｄ＋１５，０，０｝を含有するレジスタは、抽出を使用して構成される必要がある。
シグマ操作は回転を含み、ＳＩＭＤベクトル回転は、ＳＩＭＤ命令セット、例えば、ＡＲＭ先進ＳＩＭＤにおいて共通して見出されない。そのようなアーキテクチャ内のベクトル回転は、２つのベクトルシフトおよび１つのＯＲ命令を必要とする。
置換を構成する手直しもまた、レジスタの抽出を必要とする。
シグマ０およびシグマ１操作は、約７ベクトル操作からなる。
アムダールの法則に起因して、より遅い部分が、達成可能なスピードアップの量を制限するのを防ぐために、ＳＨＡ−２５６アルゴリズムの両方の部分は均衡される必要がある。
【０１３７】
これらの観察は、ＳＨＡ−２５６スケジュール更新関数を加速するための以下のＳＩＭＤ命令に至った。
SHA256SU0 Vd.4S,Vn.4S
T<127:0>=Vn<31:0>:Vd<127:32>
T<127:0>=VecROR32(T,7) XOR VecROR32(T,18) XOR VecSHR32(T,3)
Vd=VecADD32(T,Vd)
SHA256SU1 Vd.4S,Vn.4S,Vm.4S
T0<127:0>=Vm<31:0>:Vn<127:32>
T1<63:0>=Vm<127:64>
T1<63:0>=VecROR32(T1<63:0>,17) XOR VecROR32(T1<63:0>,19) XOR VecSHR32(T1<63:0>,10)
T3<63:0>=VecADD32(Vd<63:0>,T0<63:0>)
T1<63:0>=VecADD32(T3<63:0>,T1<63:0>)
T2<63:0>=VecROR32(T1<63:0>,17) XOR VecROR32(T1<63:0>,19) XOR VecSHR32(T1<63:0>,10)
T3<63:0>=VecADD32(Vd<127:64>,T0<127:64>)
Vd=VecADD32(T3<63:0>,T2<63:0>):T1<63:0>
命令は、円形キューが４つの４×３２ビットベクトルレジスタ内に常駐すると仮定する。命令は、スケジュール拡張の使用を除外しない。
【０１３８】
要素の並べ替えおよび抽出は、命令の中に引き入れられる。次にマイクロアーキテクチャは、これらならびに固定したシフトおよび回転をワイヤリングとして実装することを選択できる。
【０１３９】
命令は、大部分のマイクロアーキテクチャ内で低いサイクル待ち時間を有してよい。
【０１４０】
したがって、例示の実施形態によれば、単一命令複数データ処理回路は、入力オペランドＳｐ［１２７：０］を有し、以下のステップ、
T[127:0]={Sp[31:0]:Sq[127:32]};
T[127:0]=VecROR32(T[127:0],7) XOR VecROR32(T[127:0],18) XOR VecROR32(T[127:0],3);
および
Sq[127:0]=VecADD32(T[127:0],Sq[127:0])
により得られるものと同一の値を持つ、出力オペランドＳｑ［１２７：０］を生成する、第１のスケジュール命令によって制御されるように構成され、
式中、ＶｅｃＲＯＲ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢビット位置だけの別個の右回転であり、ＶｅｃＡＤＤ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢ内の対応する３２ビットワードへの別個の追加である。
【０１４１】
したがって、例示の実施形態によれば、単一命令複数データ処理回路は、第１の入力オペランドＳｐ［１２７：０］および第２の入力オペランドＳｑ［１２７：０］を有し、以下のステップ、
T0[127:0]={Sq[31:0]:Sp[127:32]};
T1[63:0]=Sq[127:64];
T1[63:0]=VecROR32(T1[63:0],17) XOR VecROR32(T1[63:0],19) XOR VecROR32(T1[63:0],10);
T3[63:0]=VecADD32(Sr[63:0],T0[63:0]);
T1[63:0]=VecADD32(T3[63:0],T1[63:0]);
T2[63:0]=VecROR32(T1[63:0],17) XOR VecROR32(T1[63:0],19) XOR VecROR32(T1[63:0],10);
T3[63:0]=VecADD32(Sr[127:64],T0[127:64]);
および
Sr[127:0]={VecADD32(T3[63:0],T2[63:0]):T1[63:0]}
により得られるものと同一の値を持つ、出力オペランドＳｒ［１２７：０］を生成する、第２のスケジュール命令によって制御されるように構成され、
式中、ＶｅｃＲＯＲ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢビット位置だけの別個の右回転であり、ＶｅｃＡＤＤ３２（Ａ，Ｂ）が、Ａ内の各３２ビットワードのＢ内の対応する３２ビットワードへの別個の追加である。
【０１４２】
ＳＨＡ‐２５６とＳＨＡ‐５１２との間の差異
【０１４３】
ＳＨＡ‐５１２アルゴリズムは、ＳＨＡ‐２５６アルゴリズムと非常に類似している。ＳＨＡ‐２５６のサポートを説明するセクションにおいて概説される、同一のアプローチは、ＳＨＡ−５１２に等しく適用することができ、以下のわずかな差異を伴う。
入力データは、１２８バイトのブロックに分割され、ビッグエンディアン形態で１６×６４ビットワードとして処理される。
ＳＨＡ‐５１２は、８×６４ビットワード上で動作する。
ＳＨＡ‐５１２は、８０反復のハッシュ関数を必要とする。
ハッシュ関数およびスケジュール更新は、６４ビットワード上で動作し、異なる固定したシフト、回転、およびＸＯＲを含有する。
【０１４４】
簡潔性のために、ＳＨＡ‐５１２アルゴリズムは省略する。
【０１４５】
ＳＨＡ‐５１２、ＳＨＡ‐３８４、ＳＨＡ‐５１２／２５６、およびＳＨＡ‐５１２／２５６アルゴリズムを標的とする命令
【０１４６】
ＳＨＡ−２５６を標的とする命令の動機は、ＳＨＡ−５１２アルゴリズムについても等しく保持する。ＳＨＡ−５１２を標的とするこれらの命令の可能な実現を列挙する。
ここでＳＩＭＤレジスタは１２８ビットであり、ハッシュ当たり４反復および以下のスケジュール命令を仮定する。
SHA512H{Qd,Qd+1},{Qn,Qn+1},{Vm.2D,Vm+1.2D}
SHA512H2{Qd,Qd+1},{Qn,Qn+1},{Vm.2D,Vm+1.2D}
SHA512SU0{Vd.2D,Vd+1.2D},{Vn.2D,Vn+1.2D}
SHA512SU1{Vd.2D,Vd+1.2D},{Vn.2D,Vn+1.2D},{Vm.2D,Vm+1.2D}
【０１４７】
上記命令は、マイクロアーキテクチャ内でレジスタのピンニング（１つのレジスタを特定して第２のレジスタを暗示すること）を必要とする可能性があることに留意されたい。命令は、もはや通常のＲＩＳＣ三元形態に含まれないが、例えば、ARM Limitedの複数命令を負荷／記憶するNeonにおいて、これらのタイプの操作に先行する。
【０１４８】
ここで、より広いＳＩＭＤレジスタが使用可能であり、命令の可能な変形は、以下を含む。
SHA512H Od,On,Vm.4D
SHA512H2 Od,On,Vm.4D
SHA512SU0 Vd.4D,Vn.4D
SHA512SU1 Vd.4D,Vn.4D,Vm.4D
【０１４９】
これらは、ハッシュおよびスケジュール更新操作の反復も処理するが、より広いＳＩＭＤレジスタに起因して、三元ＲＩＳＣ形態に適合する。
【０１５０】
打切りを使用して、ＦＩＰＳ１８０‐４に説明されるように、これらの命令は、ＳＨＡ−３８４、ＳＨＡ−５１２／２５６、およびＳＨＡ−５１２／２２４を等しく標的とし得る。
【図１】
2015501946.tif 000005
【図２】
2015501946.tif 000006
【図３】
2015501946.tif 000007
【国際調査報告】
2015501946.tif 000008
2015501946.tif 000009
2015501946.tif 000010