Причём, только fpc 3: тот же код, скомпилированный fpc 2.6.4 x86_64 работает отлично.
А вот fpc 3 + x86_64 + asm = битый код, который молча запарывает память и крашится где-то в другом месте.
Потом найду время - заставлю высрать ассемблерный вывод чтобы понять, чего он такого косячит. Навскидку - забивает на объявления запорченных регистров в конце asm блока.
З.Ы. Проверял только под {$asmmode intel}
Добавлено спустя 3 часа 5 минут 23 секунды:
Ничего не понимаю.
Выглядят одинаковыми:
- Код: Выделить всё
Result^.events[High(Result^.events)].eType:= deke_Terminator;
{$ifdef CPUX86_64}
asm
mov rsi, qword[Result]
mov ax, ss
mov word[rsi + TMotherSEHState.StackSegment], ax
end['rax', 'rsi'];
{$endif}
{$ifdef CPU386}
asm
mov esi, dword[Result]
mov ax, ss
mov word[esi + TMotherSEHState.StackSegment], ax
end['eax', 'esi'];
{$endif}
LeaveCriticalsection(Mother^.SehCriticalSection);
2.6.4:
- Код: Выделить всё
; [37] Result^.events[High(Result^.events)].eType:= deke_Terminator;
mov rax,qword ptr [rbp-8]
; Register raxreleased
mov dword ptr [rax+59118],1
; Register raxallocated
; Register rsiallocated
@@l3527:
; [43] mov rsi, qword[Result]
mov rsi,qword ptr [rbp-8]
@@l3528:
; [44] mov ax, ss
mov ax,ss
@@l3529:
; [45] mov word[rsi + TMotherSEHState.StackSegment], ax
mov word ptr [rsi+60],ax
; Register raxreleased
; Register rsireleased
; Register raxallocated
@@l3530:
; [56] LeaveCriticalsection(Mother^.SehCriticalSection);
mov rax,qword ptr [U_CL_CGE_MOTHER+$]
3.0.4:
- Код: Выделить всё
# [37] Result^.events[High(Result^.events)].eType:= deke_Terminator;
movq -8(%rbp),%rax
movl $1,59118(%rax)
# Register rax released
# Register rax,rsi allocated
.Ll4092:
# [43] mov rsi, qword[Result]
movq -8(%rbp),%rsi
.Ll4093:
# [44] mov ax, ss
movw %ss,%ax
.Ll4094:
# [45] mov word[rsi + TMotherSEHState.StackSegment], ax
movw %ax,60(%rsi)
# Register rsi released
# Register rax allocated
.Ll4095:
# [56] LeaveCriticalsection(Mother^.SehCriticalSection);
movq U_$CL_CGE_$$_MOTHER(%rip),%rax