Author: Bo Persson
Date: 13:17:15 06/18/00
Go up one level in this thread
On June 18, 2000 at 15:25:23, James Robertson wrote:
>I cannot remember how to do a shift in assembler and save any bits shifted off.
>Specifically, I want to shift a 64-bit integer. What is the assembler equivalent
>of:
>
>unsigned __int64 x;
>x <<= shift;
>
There really isn't a 64-bit shift available, that's why its called a 32-bit
processor :-))
So you have to do the shift in 2 steps, using a Double Precision shift, SHLD,
that can shift any 32 bits from a register pair. However, it only produces a
partial (32-bit) result, so you have to do an additional shift of the remaining
32 bits. It would look something like:
MOV EAX,[x]
MOV EDX,[x + 4] ; x now in EDX:EAX register pair
MOV CL,[shift]
SHLD EDX,EAX,CL ; shift high part
SHL EAX,CL ; shift low part
MOV [x],EAX
MOV [x + 4],EDX
Not very efficient really. If you know the 'shift' to be a constant, like 8 or
16, that can be used to improve the performance. For example, move the white
pawns on a bitboard:
inline void BitBoard::CopyAndMove_Up(const BitBoard& SourceMap)
{
Half[1] = SourceMap.Half[1] << 8;
Rank[Rank5] = SourceMap.Rank[Rank4];
Half[0] = SourceMap.Half[0] << 8;
}
>Thanks,
>James
Bo Persson
bop@malmo.mail.telia.com
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.