Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: oops here's a better version...

Author: Koundinya Veluri

Date: 03:54:38 01/15/02

Go up one level in this thread


On my computer, bsf is faster if the 1-bit is less significant and bsr is faster
if the 1-bit is more significant, so the FirstBit() and LastBit() versions with
the jumps are running faster on average. How does this test on other processors?
I'm curious...

#include <iostream>
using namespace std;

#include <windows.h>

#define ITERATIONS		(1000000000)
#define FB				(0x8000000000000000)
#define LB				(1)

inline const int FirstBit1(const unsigned __int64 bb);
inline const int FirstBit2(const unsigned __int64 bb);
inline const int LastBit1(const unsigned __int64 bb);
inline const int LastBit2(const unsigned __int64 bb);
inline const int LastBit3(const unsigned __int64 bb);

int main()
{
	unsigned int a, b, t;

	cout << "Press enter to start...";
	cin.ignore();
	cout << endl;

	t = GetTickCount();
	for(a = 0; a < ITERATIONS; ++a)
		b = FirstBit1(FB);
	t = GetTickCount() - t;
	cout << t << endl;
	cout.flush();

	t = GetTickCount();
	for(a = 0; a < ITERATIONS; ++a)
		b = FirstBit2(FB);
	t = GetTickCount() - t;
	cout << t << endl;
	cout.flush();

	cout << endl;
	cout.flush();

	t = GetTickCount();
	for(a = 0; a < ITERATIONS; ++a)
		b = LastBit1(LB);
	t = GetTickCount() - t;
	cout << t << endl;
	cout.flush();

	t = GetTickCount();
	for(a = 0; a < ITERATIONS; ++a)
		b = LastBit2(LB);
	t = GetTickCount() - t;
	cout << t << endl;
	cout.flush();

	t = GetTickCount();
	for(a = 0; a < ITERATIONS; ++a)
		b = LastBit3(LB);
	t = GetTickCount() - t;
	cout << t << endl;
	cout.flush();

	return 0;
}

const int FirstBit1(const unsigned __int64 bb)
{
	__asm
	{
		bsf		eax, [bb]
		jnz		L10
		bsf		eax, [bb + 4]
		add		eax, 32
L10:
	}
}

const int FirstBit2(const unsigned __int64 bb)
{
	__asm
	{
		bsf		eax, [bb + 4]
		add		eax, 32
		bsf		eax, [bb]
	}
}

const int LastBit1(const unsigned __int64 bb)
{
	__asm
	{
		bsr		eax, [bb + 4]
		jz		L10
		add		eax, 32
		jmp		L11
L10:
		bsr		eax, [bb]
L11:
	}
}

const int LastBit2(const unsigned __int64 bb)
{
	__asm
	{
		bsr		eax, [bb + 4]
		jnz		L10
		bsr		eax, [bb]
		sub		eax, 32
L10:
		add		eax, 32
	}
}

const int LastBit3(const unsigned __int64 bb)
{
	__asm
	{
		bsr		eax, [bb]
		sub		eax, 32
		bsr		eax, [bb + 4]
		add		eax, 32
	}
}

Output on my computer:

Press enter to start...

5898
5899

4747
6509
7080

--------
Regards,
Koundinya



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.