Optimized assembler in 32 bits mode:
Board.pas.1234: data.EnPassant := nil;
005412BF 8B45C4 mov eax,[ebp-$3c]
005412C2 33D2 xor edx,edx
005412C4 899008020000 mov [eax+$00000208],edx
Board.pas.1237: data.LastPieceCaptured := nil;
005412CA 8B45C4 mov eax,[ebp-$3c]
005412CD 33D2 xor edx,edx
005412CF 899024020000 mov [eax+$00000224],edx
Board.pas.1238: data.LastPieceMoved := nil;
005412D5 8B45C4 mov eax,[ebp-$3c]
005412D8 33D2 xor edx,edx
005412DA 899020020000 mov [eax+$00000220],edx
Board.pas.1239: data.LastMove := aMove;
005412E0 8B45C4 mov eax,[ebp-$3c]
005412E3 89B828020000 mov [eax+$00000228],edi
Board.pas.1240: piece := nil;
005412E9 33F6 xor esi,esi
Optimized assembler in 64 bits mode:
Board.pas.1234: data.EnPassant := nil;
00000000005E423F 488B8518030000 mov rax,[rbp+$00000318]
00000000005E4246 48C7800804000000000000 mov qword ptr [rax+$00000408],$0000000000000000
Board.pas.1237: data.LastPieceCaptured := nil;
00000000005E4251 488B8518030000 mov rax,[rbp+$00000318]
00000000005E4258 48C7803004000000000000 mov qword ptr [rax+$00000430],$0000000000000000
Board.pas.1238: data.LastPieceMoved := nil;
00000000005E4263 488B8518030000 mov rax,[rbp+$00000318]
00000000005E426A 48C7802804000000000000 mov qword ptr [rax+$00000428],$0000000000000000
Board.pas.1239: data.LastMove := aMove;
00000000005E4275 488B8518030000 mov rax,[rbp+$00000318]
00000000005E427C 8B8D50030000 mov ecx,[rbp+$00000350]
00000000005E4282 898838040000 mov [rax+$00000438],ecx
Both versions suffer from the same issue, loading into the same register the same value over and over (in EAX or RAX the compiler is loading the
data variable), how can this still happening?