PIR のプログラムは?

中間言語 PIR を使用して、初歩的なシンプソンの数値積分をやってみましょう。C のプログラムを先に示します。

int main()
{
	int loop = 50000000;
	int	i;
	double sum = 0;
	double x1 = 0;
	double x2 = 2*atan(1);
	double d = (x2 - x1)/(double)loop;
	for(i=0;i<loop;i+=2) {
		sum += 2*sin(x1 + (double)i*d);
		sum += 4*sin(x1 + (double)(i+1)*d);
	}
	sum += -sin(x1) + sin(x2);
	sum *= d/3;
	printf("%lf\n",sum);
	return 0;
}

これに対する PIR のプログラムは、こうなります。はてな記法はまだ、PIR プログラムに対応していないので、ソースリストに色付けができません。

.sub 'main' :main
	$I0 = 50000000
	$N1 = 0
	$N2 = atan 1
	$N2 *= 2
	$N3 = $N2 - $N1
	$N3 /= $I0

	$N0 = 0
	$I1 = 0

LOOP:
	$N4 = $N3 * $I1
	$N4 += $N1
	$N5 = sin $N4
	$N5 *= 2
	$N0 += $N5
	inc $I1

	$N4 = $N3 * $I1
	$N4 += $N1
	$N5 = sin $N4
	$N5 *= 4
	$N0 += $N5
	inc $I1

	if $I1 < $I0 goto LOOP

FIN:
	$N5 = sin $N1
	$N0 -= $N5
	$N5 = sin $N2
	$N0 += $N5
	$N0 *= $N3
	$N0 /= 3
	print $N0
	print "\n"
.end

このプログラムに $NX や $IX (Xは数字)という表記が登場しますが、これは変数ではなく、レジスタを表します。C で言えば、register 変数でしょう。$NX は数値レジスタですが、浮動小数点数に対応します。$IX は整数レジスタです。普通の変数も使用できますが、ここでは使用していません。

if-goto ループでしかループを表現できないのは PIR中間言語たる所以でしょうか。