指し手生成祭り・アセンブラを見てみよう

LS3600さんが書かれていたbitboardのイテレーション
どうアセンブラになるか見てみた

#include <intrin.h>

void main()
{
	unsigned int _c_=0;
	unsigned long _index_;
	while( _BitScanReverse( &_index_, _c_ ) )
	{
		_c_ ^= 1<< _index_; \
	}
}

cl /Ox /Ob2 /Oi /Ot test.cpp /Fatest.asm

; Line 7
	xor	ecx, ecx
	xor	eax, eax
	bsr	ecx, ecx
	je	SHORT $LN7@main
	npad	7
$LL2@main:
; Line 9
	mov	edx, 1
	shl	edx, cl
	xor	eax, edx
	bsr	ecx, eax
	jne	SHORT $LL2@main
$LN7@main:
; Line 11
	xor	eax, eax
	ret	0

見事にレジスタだけになってる。


npad 7 は始めてみたけど、ググるとnopらしい。エンディアン関係の話?
bsr命令は、かずさんの話では0を与えると不定らしいけど、
zフラグが立つと終了するので、不定の返値を使うロジックは無いので
IntelでもAMDでも問題なさそう