[fpc-devel] Object/Pointer Swap Intrinsic
J. Gareth Moreton
gareth at moreton-family.com
Wed Dec 11 09:32:59 CET 2019
Of course, I briefly forgot that UsedRegs and TmpUsedRegs aren't
objects, but arrays of objects - the same principle still applies though
to their members.
On 11/12/2019 06:26, J. Gareth Moreton wrote:
> Hi everyone,
>
> I was wondering... is there an intrinsic in Free Pascal that swaps the
> pointers stored in two object or pointer variables? That is...
> something like "procedure SwapAddresses(var Obj1: TObject; var Obj2:
> TObject);" so after it is called, Obj2 now points to Obj1 and vice
> versa? Under x86-64, for example, it can be implemented as (Intel
> notation):
>
> XOR RCX, RDX
> XOR RDX, RCX
> XOR RCX, RDX
>
> Or just
>
> XCHG RCX, RDX
>
> Both methods take just 3 cycles to perform (faster than transferring
> the object data by several orders of magnitude, plus the pointers
> don't get dereferenced). But equivalent Pascal code that typecasts
> the objects or pointers into PtrUint and then uses the xor operator
> may not be portable (e.g. on platforms that don't have pointers and
> treat objects differently).
>
> I ask this because I've noticed a slightly clever speed-up in parts of
> the peephole optimiser where "TmpUsedRegs" contains exactly the
> information required to be stored in "UsedRegs" (usually because
> "UpdateUsedRegs(TmpUsedRegs, tai(p.Next))" was called and then p was
> freed, hence any required call to "UpdateUsedRegs(tai(p.Next))" will
> reproduce the same register usage. By simply swapping the pointers
> between UsedRegs and TmpUsedRegs, I can immediately treat the contents
> of TmpUsedRegs as the live data and repurpose UsedRegs as the new
> temporary register tracking. Calls to TransferUsedRegs and
> RestoreUsedRegs are slow.
>
> Gareth aka. Kit
>
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
>
More information about the fpc-devel
mailing list