VUの乱数生成アルゴリズム

VUにおける乱数生成アルゴリズムにはM系列乱数が利用されていることは PS2 Linux付属のマニュアルに書いてありますが、
具体的な生成アルゴリズムまでは書いてありません。
ここでは、具体的な計算方法を提示します。
VUの場合、ガロア体 GF(223) における原始多項式 x23 + x5 + 1 を用いて 以下の様に乱数生成がされています。
Rレジスタは乱数の種であり、rinitで設定します。
乱数を生成するrnextは次のプログラムと同等です。

int rnext()
{
	int x = (R >> 4) & 1;
	int y = (R >> 22) & 1;
	R <<= 1;
	R ^= x ^ y;
	R &= 0x7fffff; //23bit分

	return R;
}
これはRレジスタの23bit部分の乱数です。
実際の32bit浮動小数点数の乱数を得るには、先頭に9bitの固定ビット(001111111)を付与する必要があります。