D言語のインラインアセンブラ練習

D言語のインラインアセンブラをちょっと触ってみた。

0から2*10^9-1までの総和を(mod 2^32で)求めるプログラム
test()が普通の方法。asmtestがインラインアセンブラを使用。

import std.date ;

void test(){
	uint i;
	uint s;
	for(i=0;i<2000000000;i++){
		s+=i;
	}
	printf("%u\n",s);
}

void asmtest(){
	uint s;
	asm{
	mov EAX,0;
	mov ECX,1999999999;
L1:;
	add EAX,ECX;
	loop L1;
	mov s,EAX;
	}

	printf("%u\n",s);
}

void main(){
	int starttime;

	starttime=getUTCtime();
	test();
	printf("time = %d\n", getUTCtime()-starttime);

	starttime=getUTCtime();
	asmtest();
	printf("time = %d\n", getUTCtime()-starttime);

}

実行結果

321730048
time = 6047
321730048
time = 1750

EAXとECXの値を壊しているのはもしかしたらまずいのかも知れない。