diff --git a/rtl/i386/i386.inc b/rtl/i386/i386.inc index 7c4407dbdd..c394d201ab 100644 --- a/rtl/i386/i386.inc +++ b/rtl/i386/i386.inc @@ -1165,6 +1165,26 @@ asm end; +function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler; +asm + pushl %ebx + pushl %edi +{$ifdef REGCALL} + movl %eax,%edi +{$else} + movl Target,%edi +{$endif} + movl Comperand+4,%edx + movl Comperand+0,%eax + movl NewValue+4,%ecx + movl NewValue+0,%ebx + lock cmpxchg8b (%edi) + pop %edi + pop %ebx +end; + + + {**************************************************************************** FPU diff --git a/rtl/inc/systemh.inc b/rtl/inc/systemh.inc index 45858a4492..18abbafb61 100644 --- a/rtl/inc/systemh.inc +++ b/rtl/inc/systemh.inc @@ -716,6 +716,9 @@ function InterLockedDecrement (var Target: longint) : longint; public name 'FPC_ function InterLockedExchange (var Target: longint;Source : longint) : longint; public name 'FPC_INTERLOCKEDEXCHANGE'; function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; public name 'FPC_INTERLOCKEDEXCHANGEADD'; function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE'; +{$ifdef cpui386} +function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64'; +{$endif} {$ifdef cpu64} function InterLockedIncrement64 (var Target: int64) : int64; public name 'FPC_INTERLOCKEDINCREMENT64'; function InterLockedDecrement64 (var Target: int64) : int64; public name 'FPC_INTERLOCKEDDECREMENT64';